Ich habe versucht, alle Dateien eines bestimmten Typs in Unterverzeichnissen zu finden, und für meine Zwecke brauchte ich nur den Dateinamen. Ich habe versucht, die Pfadkomponente über zu basename
entfernen, aber es hat nicht funktioniert mit xargs
:
$ find . -name '*.deb' -print | xargs basename
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.
Ich bekomme das gleiche (genau den gleichen Fehler) mit einer dieser Varianten:
$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}
Dies funktioniert andererseits wie erwartet:
$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz
Dies geschieht unter Cygwin und Debian 5.0.3. Meine Diagnose lautet, dass xargs aus irgendeinem Grund zwei Eingabezeilen an den Basisnamen übergibt, aber warum? Was ist denn hier los?
quelle
xargs
ist, dass es eine Liste von Argumenten erstellt und jedes an den Befehl weiterleitet, der danach kommt? sonst was ist der Unterschied zwischen dem undfind . -name '*.deb' | basename
?-a
Option: "Mehrere Argumente unterstützen und jedes als Namen behandeln".xargs
konvertiertstdin
in Befehlsargumente. In gewisser Weise ist es das Gegenteil vonecho
, das seine Argumente in umwandeltstdout
. Der Unterschied zwischenfind ... | xargs -n1 basename
oderfind ... | xargs basename -a
undfind ... | basename
besteht darin, dass die beiden ersteren mit Implementierungenbasename
dieses Ignorierens arbeitenstdin
.Versuche dies:
quelle
find
Befehls zu lernen , daher verwende ich ihn nur zum Suchen und Auflisten von Dateien, und ich verwende xargs für alles andere.Basisname akzeptiert nur ein einziges Argument. Die Verwendung
-exec
funktioniert ordnungsgemäß, da jeder{}
durch den aktuell verarbeiteten Dateinamen ersetzt wird und der Befehl einmal pro übereinstimmender Datei ausgeführt wird , anstatt zu versuchen, alle Argumente auf einmal an den Basisnamen zu senden.quelle
xargs
kann gezwungen werden, auch nur ein Argument zu übergeben ...find . -name '*.deb' -print | xargs -n1 basename
Dies funktioniert, die akzeptierte Antwort wird
find
jedoch angemessener verwendet. Ich habe diese Frage bei der Suche nachxargs basename
Problemen gefunden, da ich einen anderen Befehl verwende, um eine Liste der Dateispeicherorte abzurufen. Die-n1
Flagge fürxargs
war die ultimative Antwort für mich.quelle