/ / Zufällige Dateinamenargumente in zsh - zsh, Dateinamen, Befehlszeilenargumente

Mische Dateinamenargumente in zsh - zsh, Dateinamen, Befehlszeilenargumente

Zsh

Angenommen, die Anwendung kann Dateien nur über Befehlszeilenargumente öffnen. Wie gehe ich vor, um eine Liste von Dateinamen / -pfaden nach dem Zufallsprinzip zu sortieren?

Ich dachte, das sollte ziemlich einfach sein, aber anscheinend machen Räume es komplizierter als es sein sollte.


Ein Beispiel:

a.mp3
b.mp3
mit space.mp3

Wenn ich es versuche $(ls | shuf) Der Raum ist nicht entkommen und ergibt so etwas wie with space.mp3 b.mp3 a.mp3.

Verwenden der Angebotsoption -Q hilft auch nicht, weil die Befehlsersetzung den Anführungszeichen entgeht, was zu Folgendem führt: "with space.mp3" "a.mp3" "b.mp3"

Ebenso die Fluchten von -b auch entkommen: with\ space.mp3 a.mp3 b.mp3

Etwas wie find"s -exec <application> {} + ohne die entdeckung wäre es perfekt ...

Antworten:

3 für Antwort № 1

Hier ist eine zsh-only Variante, die es nicht mehr gibt ls ebenso gut wie shuf:

mplayer *.mp3(oe:REPLY=$RANDOM:)

Der Glob Qualifier o ausführt (e) den Code zwischen den beiden Doppelpunkten (:). Der Code weist wiederum jeder Datei eine Pseudozufallszahl zu $RANDOM, was zu einer willkürlichen Reihenfolge führt.

Um den Befehl etwas mehr zu verschleiern, aber hauptsächlich um Tastenanschläge zu speichern, können Sie eine Shell-Funktion definieren s:

s() { REPLY=$RANDOM }
mplayer *.mp3(oe:s:)

Oder, noch besser, definieren Sie eine Schlüsselbindung, z. zum CTRL+R für den Shuffle-Teil:

bindkey -s "^R" "(oe:REPLY=\$RANDOM:)^M"

Geben Sie jetzt nur mplayer *.mp3 gefolgt von CTRL+R, und die (oe:REPLY=$RANDOM:) Teil wird angehängt und die Kommandozeile sofort ausgeführt (^M).


5 für Antwort № 2

Du brauchst nicht ls überhaupt. Versuchen

mplayer "${(f)$(shuf -e *.mp3)}"

Das Problem mit ls ist, dass es oft auf so etwas ausgerichtet ist ls --color=always und druckt in diesem Fall unsichtbare Zeichen, die von anderen Programmen nicht richtig erkannt werden (shuf in diesem Beispiel).


0 für Antwort № 3

Ich denke, ich habe endlich eine Methode gefunden: ${(f)"$(ls | shuf)"}

Nervenzusammenbruch:

ls | shuf: Dateien / Verzeichnisse werden wie erwartet gemischt.
"$(...)": Die Anführungszeichen behalten die Ausgabe wie sie ist bei, einschließlich Zeilenumbrüchen.
${(f)...}: Teilt das Ergebnis der Erweiterung in Zeilenumbrüche auf und gibt ein Array der Datei- / Verzeichnisnamen zurück.


"${(f)$(ls | shuf)}" funktioniert auch, ${(f)$(ls | shuf)}, nicht.


Verwandte Fragen
Bemerkungen
Einen Kommentar hinzufügen