Kiedy piszę coś takiego:
find . -name *foo* | ls -lah
zwraca taki sam wynik jak zwykłe ls
polecenie, tak jakby nie miał danych wejściowych.
Jednak:
ls -lah $( find . -name *foo* )
działa dobrze, ale tylko wtedy, gdy find
polecenie ma wyniki.
Czy można przesyłać do rur ls
?
bash
command-line
ls
pipe
Lasall
źródło
źródło
Odpowiedzi:
Możesz używać
-exec
zfind
poleceniem.źródło
find . -name '*foo*' -exec ls -lah {} +
To powinno działać.
źródło
-exec +
(lub-exec \;
).xargs
można bezpiecznie używać tylko z tą-0
opcją, co oznacza, że musisz powiedzieć dowolną komendę, którąxargs
chcesz potokować, aby oddzielić elementy za pomocą NULL-bajtów (\ 0). Z tymfind
moż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.Spróbuj tego:
źródło
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 1
otrzymają dane wyjściowe,find
po 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ąls
poprawnie przesyłane do polecenia.xargs
Konstrukcja jest pod pewnymi względami lepiej niżfind etc -exec ls {} \;
z powodu wszystkich nazw wysyłane dols
naraz, więc jeśli chcesz, aby posortować je wszystkie przez datownik (używającls
), 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)źródło