Jak mogę skierować wejście potoku do polecenia ls?

20

Kiedy piszę coś takiego:

find . -name *foo* | ls -lah

zwraca taki sam wynik jak zwykłe lspolecenie, tak jakby nie miał danych wejściowych.

Jednak:

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

działa dobrze, ale tylko wtedy, gdy findpolecenie ma wyniki.

Czy można przesyłać do rur ls?

Lasall
źródło
Musisz określić, czy chcesz, aby pliki znajdowały się w każdym wyniku wyszukiwania, czy bezpośrednio wyniki wyszukiwania. Jeśli tak, to odpowiedź u / Dennis jest poprawna.
rmutalik,

Odpowiedzi:

27

Możesz używać -execz findpoleceniem.

find . -name '*foo*' -exec ls -lah {} \;
Książę John Wesley
źródło
Dziękuję za twoje rozwiązanie. Nie ma rury, ale jest to elegancka metoda. Jeśli nie znaleziono żadnych wyników z „znajdź”, to nic nie wyświetla (co w rzeczywistości jest dobre).
Lasall
7
Nieco lepszy sposób:find . -name '*foo*' -exec ls -lah {} +
jlliagre
20
find . -name *foo* | xargs -r ls -lah

To powinno działać.

wolno-myśliciel
źródło
1
Dziękuję za to rozwiązanie. Ale jak mogę poradzić sobie z białymi spacjami?
Lasall
2
@Lasall preferowanym sposobem jest użycie find's -exec +(lub -exec \;). xargsmożna bezpiecznie używać tylko z tą -0opcją, co oznacza, że ​​musisz powiedzieć dowolną komendę, którą xargschcesz potokować, aby oddzielić elementy za pomocą NULL-bajtów (\ 0). Z tym findmożesz to zrobić -print0. xargs -0 i find's -print0 nie są standardowe, ale -exec jest, więc jeśli kiedykolwiek przenośność stanowi problem, użyj find z -exec.
geirha
4

Spróbuj tego:

find  . -name *.bak -ls
Dennis
źródło
3

Użyj tego: (ls może sortować, działa z nazwami plików ze spacjami lub nietypowymi znakami)

find . -name *foo* -print0 | xargs -0 ls -lah

„-print0” oznacza, że ​​nazwy plików, takie jak file foo 1otrzymają dane wyjściowe, findpo których następuje null. Argument „-0” dla xargs nakazuje mu oczekiwać tego rodzaju danych wejściowych, więc nazwy plików ze spacjami są lspoprawnie przesyłane do polecenia.

xargsKonstrukcja jest pod pewnymi względami lepiej niż find etc -exec ls {} \;z powodu wszystkich nazw wysyłane do lsnaraz, więc jeśli chcesz, aby posortować je wszystkie przez datownik (używając ls), coś jak to działa:

find . -iname *pdf -print0 | xargs -0 ls -ltr

W systemie NetBSD opcja „-printx” jest również opcją (wydaje mi się to użytecznym argumentem, ale cokolwiek, mamy xargs -0 i jest w porządku):

find . -name *foo* -printx | xargs ls -lah (nie dla Ubuntu)

Peter Kay
źródło
To sprawiło, że mogłem faktycznie korzystać z funkcji sortowania ls, dla tych, którzy próbują to zrobić.
Harry Mustoe-Playfair