Diese Frage wurde von Fragen über Aufforderung ls
" -1
Option und die wiederkehrende Tendenz der Menschen , Fragen und Antworten zu stellen, die die Ausgabe beinhaltet die Verarbeitung ls
.
Diese Wiederverwendung der Ausgabe ls
erscheint verständlich, z. B .: Wenn Sie wissen, wie eine Liste von Dateien sortiert wird, ls
möchten Sie die Ausgabe möglicherweise auf diese Weise als Eingabe für etwas anderes verwenden.
Wenn diese Fragen und Antworten keinen Verweis auf die erstellte Dateinamenliste enthalten, die aus sich gut verhaltenden Dateinamen besteht (keine Sonderzeichen wie Leerzeichen und Zeilenumbrüche), werden sie häufig von jemandem kommentiert, der auf die Gefahr hinweist, dass die Befehlssequenz dort nicht funktioniert sind Dateien mit Zeilenumbrüchen, Leerzeichen usw.
find
, sort
und andere Hilfsprogramme lösen das Problem der Übermittlung "schwieriger" Dateinamen, xargs
indem z. B. eine Option zum Trennen der Dateinamen mit dem NUL-Zeichen / Byte verwendet wird, das kein gültiges Zeichen im Dateinamen ist (das einzige zusätzlich zu /
?) Unix / Linux-Dateisysteme.
Ich habe in der Manpage nach ls
und in der Ausgabe nach ls --help
(die mehr Optionen enthält) gesucht und konnte nicht feststellen, dass ls
(von coreutils
) eine Option zur Angabe einer durch NUL getrennten Ausgabe enthält. Es macht einen haben -1
Option , die als interpretiert werden kann „Ausgabedateinamen durch Newline getrennt“ )
F : Gibt es einen technischen oder philosophischen Grund, warum ls
es keine Option --zero
oder gibt -0
, die "Dateinamen durch NUL getrennt ausgeben" würde?
Wenn Sie etwas tun, das nur die Dateinamen ausgibt (und nicht zB verwendet -l
), könnte dies Sinn machen:
ls -rt -0 | xargs -r0 …
Mir könnte etwas fehlen, warum dies nicht funktionieren würde, oder es gibt eine Alternative für dieses Beispiel, die ich übersehen habe und die nicht viel komplizierter und / oder undurchsichtiger ist .
Nachtrag:
Doing ls -lrt -0
wahrscheinlich machen nicht viel Sinn, aber in der gleichen Art und Weise , die find . -ls -print0
nicht der Fall ist, so dass kein Grund zu keinen bieten -0
/ -z
/ --zero
Option.
quelle
ls -rtz
wäre auf jeden fall nützlich. Vergleichen Sie die Alternative: superuser.com/a/294164/21402Antworten:
UPDATE (2014-02-02)
Dank unserer eigenen Entschlossenheit bei @ Anthon, das Fehlen dieser Funktion nachzuvollziehen , haben wir einen etwas formelleren Grund, warum diese Funktion fehlt, was ich zuvor erklärt habe:
Meine ursprüngliche Antwort
Dies ist ein bisschen meine persönliche Meinung, aber ich glaube, dass es eine Designentscheidung ist, diesen Schalter nicht zu benutzen
ls
. Wenn Sie bemerken, dass derfind
Befehl diesen Schalter hat:Wenn Sie diesen Schalter weglassen, deuten die Designer an, dass Sie die
ls
Ausgabe nur für den menschlichen Verzehr verwenden sollten. Für die Weiterverarbeitung durch andere Tools sollten Siefind
stattdessen verwenden.Möglichkeiten zu finden
Wenn Sie nur nach alternativen Methoden suchen, finden Sie diese hier mit dem Titel: Richtige Vorgehensweise : Eine kurze Zusammenfassung . Von diesem Link sind dies wahrscheinlich die drei häufigsten Muster:
(Nicht standardmäßige allgemeine Erweiterungen -print0 und -0. Funktioniert unter GNU, * BSDs, busybox)
Weitere Beweise?
Ich fand diesen Blog-Beitrag von Joey Hess 'Blog mit dem Titel: " ls: the missing options ". Einer der interessanten Kommentare in diesem Beitrag:
Bei der weiteren Suche habe ich dies in den Commit-Protokollen eines der zusätzlichen Schalter gefunden, die Joeys Blog-Post erwähnt: " Neues Ausgabeformat -j ". Es scheint also, als würde der Blog-Beitrag Spaß daran machen, jemals einen
-z
Schalter hinzuzufügenls
.Verweise
quelle
-0
in meine Frage Hinweise darauf aufnehmen sollen, warum nicht (zumindest nicht, bis dies umgesetzt wurde), um die Menschen nicht in die Irre zu führen.ls -1 | tr '\012' '\000'
werden Dateien durch NULL-Zeichen getrennt aufgelistet.Da die Antworten von @ slm auf die Ursprünge und möglichen Gründe eingehen, werde ich dies hier nicht wiederholen. Eine solche Option ist nicht in der Liste der abgelehnten Coreutils enthalten , aber der unten stehende Patch wird jetzt von Pádraig Brady abgelehnt, nachdem er an die Mailing-Liste von Coreutils gesendet wurde. Aus der Antwort geht hervor, dass dies ein philosophischer Grund ist (die
ls
Ausgabe ist für den menschlichen Verzehr bestimmt).Wenn Sie ausprobieren möchten, ob eine solche Option für Sie zumutbar ist, tun Sie Folgendes:
Wenden Sie dann den folgenden Patch gegen commit an: b938b6e289ef78815935ffa705673a6a8b2ee98e dd 29.01.2014:
Nach einem anderen make kannst du es testen mit:
Der Patch funktioniert also und ich kann keinen Grund dafür erkennen, aber das ist kein Beweis, dass es keinen technischen Grund gibt, die Option auszulassen.
ls -R0
macht vielleicht nicht viel Sinn, macht aber auch nichtls -Rm
das , was man sofort machenls
kann.quelle
-z
und--zero
ist eher im Einklang mit Art (auch in Coreutils.