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?


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 {} \;

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.


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


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)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.