Ich versuche, nur Nicht-Bilddateien aufzulisten und nur in den letzten 500 Dateien zu suchen. Also renne ich
ls -t | head -500 | file | grep -v 'image'
was nicht richtig ist: es zeigt eine Hilfemeldung an. Ändern in
ls -t | head -500 | xargs file | grep -v 'image'
Ich jetzt manchmal die Ausgabe erhalte ich will, aber wenn der Dateiname Leerzeichen in es-zum Beispiel hat Plutonian\ Nights\ -\ Sun\ Ra.mp3
-dann xargs
läuft file Plutonian
, file Nights
usw.
Wie kann ich entweder helfen xargs
, die Räume zu sehen, oder auf andere Weise das erreichen, was ich erreichen möchte ?
xargs
Implementierungen kann das Trennzeichen beispielsweise in geändert werden'\n'
. Dies ist häufig hilfreich, wenn die Eingabe nicht von generiert wirdfind
. Siehe-d
(GNU) und-E
(OSX)Antworten:
Unter Verwendung
xargs
, kann es auf diese Weise durchgeführt werden:Ist
xargs
aber so gestern. Die coolen Kids benutzenparallel
heute. Mit parallel wäre es:Sehen. Keine Verwendung von -print0 und -0.
parallel
ist wirklich klug für sich.AKTUALISIEREN
Um nur die letzten 500 Dateien aufzulisten, lautet Ihr Befehl:
Wichtig
Wenn Ihre Parallele alt ist und die obige Syntax nicht funktioniert, installieren Sie die neue Version von Parallel wie hier beschrieben: http://www.gnu.org/software/parallel/parallel_tutorial.html
quelle
Verwenden Sie "find" mit der Option "-print0" und leiten Sie die Ausgabe mit der Option "-0" an "xargs" weiter.
Obwohl ich diese Technik kenne (und verwende), sehe ich, dass Benutzer @Jens eine ähnliche Frage beantwortet hat, wo Sie weitere Details finden können:
/programming/16758525/use-xargs-with-filenames-containing-whitespaces
quelle
Ich habe zwei grobe Vorschläge, die helfen könnten. Beides fühlt sich jedoch nicht besonders befriedigend an, sodass vielleicht etwas Besseres herauskommt.
Verwenden Sie zunächst sed, um Anführungszeichen zu allem hinzuzufügen, sodass Sie nur dann Probleme haben, wenn der Dateiname Anführungszeichen wie enthält
Die andere ist, die ls zu verwenden, um die 501. neueste zu finden, und dann find zu verwenden, um die neueren Sachen wie zu erhalten
quelle
tr \\n \\0
) ersetzen und verwendenxargs -0
.Allgemeine Hinweise zur Verarbeitung von Dateinamen, die möglicherweise Leerzeichen enthalten, finden Sie unter Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen?
Die Schwierigkeit bei dem, was Sie versuchen, besteht darin, dass es keine gute Möglichkeit gibt, die N neuesten Dateien mit Standardwerkzeugen aufzulisten.
Der einfachste Weg, das zu tun, was Sie hier tun, besteht darin, zsh als Shell zu verwenden. Es verfügt über Glob-Qualifizierer zum Sortieren von Dateien nach Datum. So führen Sie
file
die 500 neuesten Dateien aus:Übergeben Sie mit dem Linux-
file
Dienstprogramm die Option-i
oder--mime-type
, um eine Ausgabe zu erhalten, die einfacher zu analysieren ist. Bilddateien werden durch Zeilen gekennzeichnet, die mit endenimage/something
.Wenn Sie mit absolut allen Dateinamen fertig werden müssen, einschließlich derer mit einem Zeilenumbruch im Namen, verwenden Sie die
-0
Option für eine durch Nullen getrennte Ausgabe. Neuere Versionen von GNU sed können anstelle von Zeilenumbrüchen Null-Bytes als Datensatztrennzeichen verwenden.Wenn Sie nicht über zsh verfügen, können Sie
ls
Dateinamen verwenden und verarbeiten, die Leerzeichen, aber keine Zeilenumbrüche oder nachgestellten Leerzeichen enthalten, indem Sie die-L1
Option an übergebenfile
. Dies wird jeweilsfile
für eine Datei aufgerufen , ist also etwas langsamer.quelle
Sie könnten es versuchen
Dies zwingt xargs, die Dateinamenargumente auf Null zu setzen.
quelle
Sun Ra
), wird dies angezeigtSun\0Ra\0
, sodass das Problem dadurch nicht gelöst wird.printf
wird jedes durch Leerzeichen getrennte Wort als Argument betrachten. Sie können dies mit testenprintf "%s\n" $(printf "file #1\nfile2\n")
.image
Teil der Frage verpasst .