Wie öffne ich mehrere Dateien mit dem Standardprogramm vom Terminal?

12

Ich habe versucht, alle meine MP3-Dateien aus einem Ordner mit zu öffnen, xdg-open aber ich habe herausgefunden, dass nur eine geöffnet wird! Also habe ich ein wenig gesucht, aber es gab keine solche Frage! Ich fand "evince", aber anscheinend öffnet es Textdateien und gnome-open öffnet auch eine Datei.

Ich möchte alle Dateien des gleichen Formats in einem Ordner vom Terminal aus öffnen. Ich bin neu in Ubuntu, bitte erklären Sie etwas mehr.

Karo
quelle
1
xdg-opensollte dies wirklich standardmäßig können ... Übergeben Sie einfach die Argumentliste an das Programm. Komm schon freedesktop.org Leute! :-)
Ciro Santilli 事件 改造 中心 中心 六四 事件

Antworten:

7

Tatsächlich. Sie könnten Shell verwenden, um dies zu umgehen:

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

Oder versuchen Sie es, wenn Sie es robuster möchten

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
Agoston Horvath
quelle
Die erste funktioniert nicht mit Dateien mit Leerzeichen im Namen, und die zweite funktioniert überhaupt nicht ( find: paths must precede expression: -).
Sparhawk
1
Wenn Sie sorgfältig lesen, schrieb ich "wenn Sie es robuster wollen ...", daher funktioniert die erste, einfache Version zwar nicht mit Leerzeichen, aber das war nicht die Absicht. Die zweite Lösung funktioniert mit Ubuntu. Zu Ihrer Information, neuere Versionen von find haben standardmäßig den Pfadnamen.
Agoston Horvath
Ich bin mir nicht sicher, ob der fehlende Pfad das Problem in der zweiten ist (trotz der Fehlermeldung). Ich habe versucht einzutragen .und habe die gleiche Fehlermeldung erhalten. In einem anderen Verzeichnis bekomme ich xdg-open: unexpected argument './foo.mp3'mit oder ohne ..
Sparhawk
Ich denke auch, dass Leerzeichen in Namen kein so ungewöhnliches Szenario sind, dass sie selbst in "einfachen" Fällen ignoriert werden sollten.
Sparhawk
Ich weiß nicht genug über Ihr spezifisches Setup, um es sicher zu sagen, aber xdg-open funktioniert wie bei einer neuen Ubuntu-Installation beschrieben. Siehe man xdg-open, wenn Sie sich nicht sicher sind.
Agoston Horvath
4

Du kannst es versuchen:

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

ls *.mp3Wenn Sie alle MP3-Dateien aus dem aktuellen Verzeichnis auflisten, jede in einer eigenen Zeile, wird die Ausgabe an eine whileSchleife weitergeleitet, die den Inhalt jeder Zeile liest, und dieser Inhalt wird geöffnet (in diesem Fall der Name einer MP3-Datei) ) in seiner Standardanwendung.

Radu Rădeanu
quelle
@ Karel Ich habe die -rFlagge hinzugefügt . Ich denke, dies ist notwendig, um Dateien mit einem `\` im Namen korrekt zu analysieren.
Sparhawk
2
ähm ... werden dadurch nicht mehrere Instanzen desselben Programms geöffnet?
Braiam
@karel Ja… meine man readhat auch überhaupt keine Flaggen aufgelistet! Ich bekomme keinen Fehler beim Testen, aber das liegt wahrscheinlich daran, dass ich aaaund erstellt habe aa\a. In diesem Fall wird xdg-opennur versucht, aaazweimal zu öffnen , und nicht aa\a. (Okay, es wird ein bisschen verworren, aber ich denke, Code sollte in allen Situationen funktionieren. Vielleicht findist es eine bessere Option, um die Einschränkungen von lsund zu vermeiden read.) Und wie kann es genau Chaos anrichten? Wird es nicht nur die Ausgabe von analysieren ls?
Sparhawk
@karel man readverweist auf die gelesene C-Funktion (Abschnitt 2 des Mannes). Dies readist ein eingebauter Bash-Befehl, daher sollten Sie man bashirgendwo in Zeile 4632 nachsehen. @Sparhawk - danke für die Bearbeitung.
Radu Rădeanu
@Braiam umm ... dies ist bei MP3s nicht der Fall und hängt von den Einstellungen der Standardanwendung ab. Das Verhalten ist das gleiche wie beim Öffnen mehrerer Dateien von Nautilus oder Ihrem bevorzugten Dateimanager.
Radu Rădeanu
4

Ich habe ein kleines Skript geschrieben /usr/local/bin/o, obwohl Sie es einfach aufrufen /usr/local/bin/xdg-openund den Standardbefehl ersetzen können, wenn Sie möchten (vorausgesetzt, Sie $PATHgeben ihm Priorität). Wenn kein Argument angegeben wird, öffnet dieses Skript stattdessen das aktuelle Verzeichnis.

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

Wenn Sie das aktuelle Verzeichnis nicht ohne Argument öffnen möchten, wird das Standardverhalten beibehalten, dh die Verwendung wird angezeigt.

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

Hinweis: Dies ist unabhängig von der Fähigkeit des Standardprogramms, mehrere Argumente zu analysieren. Stattdessen wird jeder Befehl für jedes Argument einmal aufgerufen. Ich glaube nicht, dass es einen eleganten Weg gibt, da Benutzer möglicherweise xdg-openverschiedene Arten von Dateien verwenden möchten und einige Befehle ohnehin nicht mehrere Argumente annehmen.

Sparhawk
quelle
1

Ich habe dieses bashSkript geschrieben, um alle Anwendungsfälle abzudecken, die mir einfallen:

#!/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

Eigenschaften:

  • Schreibt die Fehlerausgabe in ~ / .xsession-Fehler, anstatt das Terminal zu verschmutzen oder wegzuwerfen
  • Standardmäßig werden maximal 10 Dateien geöffnet (um Bildschirm / Prozessor nicht zu überlasten).
  • Kann mit ein neues Maximum setzen max=20 open $(ls -Q)
  • Erlaube das Öffnen aller Dateien, z all=1 open $(ls -Q)
Tom Hale
quelle
0

Hier ist ein Einzeiler:

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

Da ich VLC installiert habe (und standardmäßig für MP3s), werden für mich alle MP3-Dateien in einem Verzeichnis mit VLC geöffnet. Dies ist keine Art von " universellem Lösen von allem und Arbeiten in jedem verdammten Fall ", aber es sollte funktionieren.

Erläuterung:

ls -AQplistet "fast alle" Dateien auf, zitiert Dateinamen und fügt Schrägstriche an Namen von Verzeichnissen an. Ersetzen Sie -pdurch, --file-typewenn Sie auch Symlinks ausschließen möchten. Zitieren bei Leerzeichen in Dateinamen.

grep "\.mp3\"$" Wählt nur Dateien aus, die mit ".mp3" enden (plus doppeltes Anführungszeichen).

xargs Leitet das gesamte Los an das Programm um, das die folgende Unterschale zurückgibt.

Unterschale:

xdg-mime query default audio/mpegGibt den Namen der Standard-App im Format "app.desktop" für Dateien an, deren MIME ist audio/mpeg. Sie können den Mimetyp für jede Datei in Ihrer Umgebung mit überprüfen xdg-mime query filetype /path/to/file. Ich habe "Audio / MPEG" für MP3-Datei.

grep -oP '.+(?=\.desktop)' Ruft die "App" von "app.desktop" ab.

Wenn Sie es sehr häufig in einem System verwenden, das sich nicht wesentlich ändert, sollten Sie es folgendermaßen kürzen:

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

Wo Sie durch default_appdas eigentliche Programm ersetzen , das mit den Dateien geöffnet wird. Sie können seinen Namen damit herausfinden:

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


xdg-openfunktioniert nicht mit diesem Problem, da es nur ein Argument von Entwurf akzeptiert. Wenn Sie verwenden xargs -n1, werden Sie wahrscheinlich damit an die Wand stoßen, dass die resultierende fragliche App möglicherweise jede Datei in einer neuen Instanz öffnet, was in mehr als einer Hinsicht hässlich werden kann.

F-3000
quelle
-1

Sie können diese Befehle verwenden

cd /path/to/source_folder

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

Nur wenn Ihr Musik-Player mehrere Dateien als Befehlszeilenargumente unterstützt. Ersetzen Sie ihn vlcdurch einen Musikplayer Ihrer Wahl.

Dies funktioniert mit RhythmBox und VLC in meinen Tests.

kiri
quelle
Führt nicht find... -execeinzelne Befehle für jede Datei aus? Wenn Ihr Musik-Player mehrere Dateien als Befehlszeilenargumente unterstützt, können Sie diese auch verwenden vlc *.mp3.
Sparhawk
@ Sparhawk Nicht mit \+am Ende
AB
@AB Ah ja, guter Punkt; Ich hab mich geirrt. Nach meinem zweiten Satz scheint es jedoch sinnlos zu sein, findwenn Sie vlctrotzdem Hardcode verwenden . (Die Frage legt nahe, dass sie alle in einem Verzeichnis sind.)
Sparhawk
Nur +ist genug, keine Notwendigkeit für \+.
Grumbel
-1

Verwenden Sie diesen Befehl für MP3-Dateien, wenn Sie Dateien in VLC öffnen möchten.

vlc /directory/*.mp3

Hinweis: Verwenden Sie diese Option cvlc, um VLC ohne Schnittstelle zu verwenden.

Karo
quelle
3
Die Frage lautet "Standardprogramm", daher ist die direkte Verwendung von VLC etwas ... sinnlos.
Muru