Wenn ich etwas schreibe wie:
find . -name *foo* | ls -lah
Es gibt dasselbe Ergebnis wie ein einfacher ls
Befehl zurück, als ob es keine Eingabe hätte.
Jedoch:
ls -lah $( find . -name *foo* )
funktioniert gut, aber nur wenn der find
Befehl Ergebnisse hat.
Ist es möglich zu pfeifen ls
?
bash
command-line
ls
pipe
Lasall
quelle
quelle
Antworten:
Sie können
-exec
mitfind
Befehl verwenden.quelle
find . -name '*foo*' -exec ls -lah {} +
Das sollte funktionieren.
quelle
-exec +
(oder-exec \;
) zu verwenden.xargs
ist nur mit der-0
Option sicher zu verwenden , dh Sie müssen angeben, zu welchem Befehl Sie die Pipexargs
weiterleiten, um die Elemente mit NULL-Bytes (\ 0) abzugrenzen. Mitfind
kannst du das machen mit-print0
. xarg's -0 und find's -print0 sind nicht Standard, aber -exec ist, also wenn Portabilität jemals ein Problem ist, benutze find with -exec.Versuche dies:
quelle
Verwenden Sie dies: (ls kann sortieren, arbeitet mit Dateinamen mit Leerzeichen oder ungewöhnlichen Zeichen)
find . -name *foo* -print0 | xargs -0 ls -lah
"-print0" bedeutet, dass Dateinamen wie
file foo 1
vonfind
gefolgt von null ausgegeben werden. Das Argument "-0" für xargs weist es an, diese Art von Eingabe zu erwarten, sodass Dateinamen mit Leerzeichenls
korrekt an den Befehl weitergeleitet werden.Die
xargs
Konstruktion ist in gewisser Hinsicht besser, als wennfind etc -exec ls {} \;
alle Dateinamen gleichzeitig gesendetls
werden. Wenn Sie also alle nach Zeitstempel (mitls
) sortieren möchten, funktioniert Folgendes :find . -iname *pdf -print0 | xargs -0 ls -ltr
Auf einem NetBSD-System ist "-printx" ebenfalls eine Option (dies scheint mir ein nützliches Argument zu sein, aber was auch immer, wir haben xargs -0 und es ist in Ordnung):
find . -name *foo* -printx | xargs ls -lah
(nicht für Ubuntu)quelle