jak otworzyć wiele plików za pomocą domyślnego programu z terminala?

13

Próbowałem otworzyć wszystkie moje pliki .mp3 z folderu przy użyciu, xdg-open ale odkryłem, że otwiera tylko jeden! Więc trochę szukałem, ale nie było takiego pytania! Znalazłem „evince”, ale najwyraźniej otwiera on pliki tekstowe, a gnome-open również otwiera jeden plik.

Chcę otworzyć wszystkie pliki tego samego formatu w folderze z terminala. Jestem nowy w Ubuntu, więc proszę wyjaśnij trochę więcej.

karo
źródło
1
xdg-opennaprawdę powinien być w stanie to zrobić domyślnie ... wystarczy przekazać listę argumentów do programu. Przyjdź na freedesktop.org ludzi! :-)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

8

W rzeczy samej. Aby obejść ten problem, możesz użyć powłoki:

ls -b *.mp3 | xargs -n 1 xdg-open

Lub, jeśli chcesz, aby był bardziej niezawodny, spróbuj

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
Agoston Horvath
źródło
Pierwszy nie działa z plikami z białymi znakami w nazwie, a drugi w ogóle nie działa ( find: paths must precede expression: -).
Sparhawk
1
Jeśli czytasz uważnie, napisałem „jeśli chcesz, żeby był bardziej solidny ...”, stąd pierwsza prosta wersja nie działa ze spacjami, ale nie o to chodziło. Drugie rozwiązanie działa z Ubuntu; Do Twojej wiadomości, nowsze wersje znajdź domyślną nazwę ścieżki do.
Agoston Horvath,
Nie jestem pewien, czy brak ścieżki jest problemem w drugim (pomimo komunikatu o błędzie). Próbowałem umieścić .i dostałem ten sam komunikat o błędzie. W innym katalogu dostaję się xdg-open: unexpected argument './foo.mp3'z lub bez ..
Sparhawk
Uważam też, że spacje w nazwach nie są tak rzadkim scenariuszem, że należy go lekceważyć, nawet w „prostych” przypadkach.
Sparhawk
Nie wiem na pewno o twojej konkretnej konfiguracji, aby powiedzieć na pewno, ale xdg-open działa tak, jak opisałem przy nowej instalacji Ubuntu. Zobacz man xdg-open, jeśli nie jesteś pewien.
Agoston Horvath,
4

Możesz spróbować:

ls *.mp3 | while read -r file; do xdg-open "$file"; done

ls *.mp3wyświetli listę wszystkich plików mp3 z bieżącego katalogu, każdy w osobnym wierszu, a wynik zostanie przesłany do whilepętli, która odczyta zawartość każdego wiersza i otworzy tę zawartość (w tym przypadku jest to nazwa pliku mp3 ) w domyślnej aplikacji.

Radu Rădeanu
źródło
@karel Dodałem -rflagę. Myślę, że jest to konieczne, aby poprawnie parsować pliki z `\ w nazwie.
Sparhawk
2
umm ... czy to nie otworzy kilku wystąpień tego samego programu?
Braiam
@karel Tak… mój man readteż nie ma na liście żadnych flag! Podczas testowania nie pojawia się błąd, ale prawdopodobnie dlatego, że utworzyłem aaai aa\a. W takim przypadku xdg-openpo prostu próbuje otworzyć aaadwa razy, a nie aa\a. (W porządku, robi się trochę skomplikowany, ale myślę, że kod powinien działać we wszystkich sytuacjach. Być może findjest to lepsza opcja, aby uniknąć ograniczeń lsi read.) Ponadto, w jaki sposób może siać spustoszenie dokładnie? Czy to nie tylko parsuje wyjście ls?
Sparhawk
@karel man readodnosi się do odczytanej funkcji C (sekcja 2 man). To readjest wbudowane polecenie bash, więc powinieneś zajrzeć man bashgdzieś w linii 4632. @Sparhawk - dzięki za edycję.
Radu Rădeanu
@Braiam umm ... nie dotyczy to plików mp3 i zależy od ustawień domyślnej aplikacji. Zachowanie jest takie samo, jak w przypadku otwierania wielu plików z Nautilus lub ulubionego menedżera plików.
Radu Rădeanu
4

Napisałem mały skrypt /usr/local/bin/o, chociaż możesz go po prostu wywołać /usr/local/bin/xdg-openi zastąpić domyślną komendą, jeśli chcesz (zakładając, że $PATHdajesz jej priorytet). Ponadto, jeśli nie zostanie podany żaden argument, skrypt otworzy zamiast tego bieżący katalog.

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open . &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi

Jeśli nie chcesz otwierać bieżącego katalogu bez argumentów, zachowuje to domyślne zachowanie, tzn. Pokazuje użycie.

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi

Uwaga: jest to niezależne od zdolności domyślnego programu do analizowania wielu argumentów, ale zamiast tego wywoła każde polecenie raz dla każdego argumentu. Nie sądzę, aby istniało eleganckie rozwiązanie tego problemu, ponieważ użytkownicy mogą chcieć xdg-openróżnego rodzaju plików, a niektóre polecenia i tak nie przyjmują wielu argumentów.

Krogulec
źródło
1

Napisałem ten bashskrypt, aby opisać wszystkie przypadki użycia, o których mogłem pomyśleć:

#!/bin/bash
set -euo pipefail; shopt -s failglob # bash strict mode

max=${max:-10} # Set default maximum if $max is not set
[[ ${all:-} ]] && max=$# # Set max to all files if $all is non-null

for file in "${@:1:$max}"; do
  xdg-open "$file"
done &>>~/.xsession-errors

Funkcje:

  • Zapisuje wyjście błędu w ~ / .xsession-error zamiast zanieczyszczać terminal lub wyrzucać go
  • Domyślnie otwiera maksymalnie 10 plików (aby nie przeciążać ekranu / procesora)
  • Można ustawić nowe maksimum za pomocą max=20 open $(ls -Q)
  • Zezwalaj na otwieranie wszystkich plików, np all=1 open $(ls -Q)
Tom Hale
źródło
0

Oto jedna linijka:

ls -AQp | grep "\.mp3\"$" | xargs `xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'`

Ponieważ mam zainstalowaną VLC (i domyślnie dla mp3), to otwiera dla mnie wszystkie pliki mp3 w katalogu z VLC. Nie jest to żaden rodzaj „ uniwersalnego rozwiązania dla wszystkich dziwnych przypadków ”, ale powinno działać.

Wyjaśnienie:

ls -AQpwyświetla listę „prawie wszystkich” plików, cytując nazwy plików i dodając ukośnik do nazw katalogów. Wymień -psię --file-type, jeśli chcesz, aby wykluczyć dowiązania jako dobrze. Cytowanie w przypadku spacji w nazwach plików.

grep "\.mp3\"$" wybiera tylko pliki, które kończą się „.mp3” (plus podwójny cudzysłów).

xargs przekierowuje całą partię do programu, który następuje po powrocie podpowłoki.

podpowłoka:

xdg-mime query default audio/mpegpodaje domyślną nazwę aplikacji w formacie „app.desktop” dla plików, których mime to audio/mpeg. Możesz sprawdzić typ mime dla dowolnego pliku w swoim środowisku za pomocą xdg-mime query filetype /path/to/file. Mam plik „audio / mpeg” do pliku mp3.

grep -oP '.+(?=\.desktop)' pobiera „aplikację” z „app.desktop”.

Jeśli zamierzasz używać go bardzo często w systemie, który niewiele się zmieni, możesz go skrócić do tego:

ls -AQp | grep "\.mp3\"$" | xargs default_app

Gdzie zamieniasz default_appna rzeczywisty program, który otwiera się z plikami. Możesz dowiedzieć się, jak się nazywa:

xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'


xdg-opennie będzie działać z tym problemem, ponieważ z założenia przyjmuje tylko jeden argument. Jeśli używasz xargs -n1, prawdopodobnie trafisz w ścianę dzięki temu, że wynikowa aplikacja może otworzyć każdy plik w nowej instancji, co może stać się brzydkie na więcej niż jeden sposób.

F-3000
źródło
-1

Możesz użyć tych poleceń

cd /path/to/source_folder

find . -type f -name *.mp3 -exec vlc {} \+

tylko jeśli Twój odtwarzacz muzyki obsługuje wiele plików jako argumenty wiersza poleceń. Zamień vlcna wybrany odtwarzacz muzyki.

Działa to z RhythmBox i VLC w moich testach.

kiri
źródło
Czy find... nie -execuruchamia poszczególnych poleceń dla każdego pliku? A także, jeśli twój odtwarzacz muzyki obsługuje wiele plików jako argumenty wiersza poleceń, możesz po prostu użyć vlc *.mp3.
Sparhawk
@Sparhawk Not with \+at the end
AB
@AB Ach tak, dobra uwaga; Myliłem się. Jednak, jak w moim drugim zdaniu, wydaje się bezcelowe używanie, findjeśli i tak zamierzasz dokonać twardego kodu vlc. (Pytanie sugeruje, że wszystkie znajdują się w jednym katalogu.)
Sparhawk
Wystarczy +, nie ma potrzeby \+.
Grumbel
-1

Użyj tego polecenia do plików mp3, jeśli chcesz otwierać pliki w VLC.

vlc /directory/*.mp3

Uwaga: Użyj, cvlcaby użyć VLC bez interfejsu.

karo
źródło
3
Pytanie brzmi „program domyślny”, więc bezpośrednie użycie VLC jest nieco ... bezcelowe.
muru