Wie kann ich eine Pipe-Eingabe an den Befehl ls leiten?

20

Wenn ich etwas schreibe wie:

find . -name *foo* | ls -lah

Es gibt dasselbe Ergebnis wie ein einfacher lsBefehl zurück, als ob es keine Eingabe hätte.

Jedoch:

ls -lah $( find . -name *foo* )

funktioniert gut, aber nur wenn der findBefehl Ergebnisse hat.

Ist es möglich zu pfeifen ls?

Lasall
quelle
Sie müssen angeben, ob Sie die Dateien in den einzelnen Suchergebnissen anzeigen möchten, oder ob Sie die Suchergebnisse direkt anzeigen möchten. Wenn es das letztere ist, ist die Antwort von u / Dennis die richtige Antwort.
rmutalik

Antworten:

27

Sie können -execmit findBefehl verwenden.

find . -name '*foo*' -exec ls -lah {} \;
Prinz John Wesley
quelle
Vielen Dank für Ihre Lösung. Es gibt keine Pfeife, aber es ist eine elegante Methode. Wenn mit 'find' keine Ergebnisse gefunden werden, wird nichts angezeigt (was eigentlich gut ist).
Lasall
7
Ein etwas besserer Weg:find . -name '*foo*' -exec ls -lah {} +
jlliagre
20
find . -name *foo* | xargs -r ls -lah

Das sollte funktionieren.

Freidenker
quelle
1
Vielen Dank für diese Lösung. Aber wie gehe ich mit Leerzeichen um?
Lasall
2
@Lasall ist die bevorzugte Methode, find's -exec +(oder -exec \;) zu verwenden. xargsist nur mit der -0Option sicher zu verwenden , dh Sie müssen angeben, zu welchem ​​Befehl Sie die Pipe xargsweiterleiten, um die Elemente mit NULL-Bytes (\ 0) abzugrenzen. Mit findkannst 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.
Geirha
4

Versuche dies:

find  . -name *.bak -ls
Dennis
quelle
3

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 1von findgefolgt von null ausgegeben werden. Das Argument "-0" für xargs weist es an, diese Art von Eingabe zu erwarten, sodass Dateinamen mit Leerzeichen lskorrekt an den Befehl weitergeleitet werden.

Die xargsKonstruktion ist in gewisser Hinsicht besser, als wenn find etc -exec ls {} \;alle Dateinamen gleichzeitig gesendet lswerden. Wenn Sie also alle nach Zeitstempel (mit ls) 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)

Peter Kay
quelle
Dies war für mich der Trick, um die Sortierfunktionen von ls tatsächlich nutzen zu können, für diejenigen, die dies versuchen.
Harry Mustoe-Playfair