Як я можу направити трубопровід на команду ls?


20

Коли я набираю щось на кшталт:

find . -name *foo* | ls -lah

вона повертає той самий результат, що і звичайна lsкоманда, як ніби вона не мала введення.

Однак:

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

працює добре, але лише тоді, коли findкоманда має результати.

Чи можна на трубу ls?


Вам потрібно вказати, чи потрібно використовувати файли всередині кожного результату пошуку, чи потрібно безпосередньо знайти результати пошуку. Якщо це останнє, то відповідь u / Dennis - це правильна відповідь.
rmutalik

Відповіді:


27

Ви можете використовувати -execз findкомандою.

find . -name '*foo*' -exec ls -lah {} \;

Дякую за ваше рішення. Труби немає, але це елегантний метод. Якщо не знайдено жодного результату за допомогою параметра "знайти", він нічого не відображає (що насправді добре).
Ласолл

7
Трохи кращий спосіб:find . -name '*foo*' -exec ls -lah {} +
jlliagre

20
find . -name *foo* | xargs -r ls -lah

Це має спрацювати.


1
Дякую за рішення. Але як я можу поводитися з пробілами?
Ласолл

2
@Lasall кращим способом є використання find -exec +(або -exec \;). xargsбезпечно використовувати лише цю -0опцію, це означає, що вам потрібно повідомити будь-яку команду, до якої потрібно подати, xargsдля розмежування елементів з NULL-байтами (\ 0). З findтобою можна це зробити -print0. xargs's -0 і find -print0 не є стандартними, але -exec є, тому, якщо переносимість коли-небудь є проблемою, використовуйте find з -exec.
geirha


3

Використовуйте це: (можна сортувати, працює з назви файлів з пробілами або незвичайними символами)

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

"-print0" означає, що такі імена файлів file foo 1отримають результат з findнаступного null. Аргумент "-0" для xargs сповіщає його очікувати такого типу введення, тому імена файлів з пробілами потрапляють в lsкоманду правильно.

xargsБудівництво в деяких відносинах краще , ніж , find etc -exec ls {} \;тому що всі імена файлів будуть послані lsвідразу, так що якщо ви хочете , щоб впорядкувати їх все мітки часу (використовуючи ls), що - щось на зразок цього твору:

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

У системі NetBSD "-printx" також є варіантом (це здається мені корисним аргументом, але що б ми не мали xargs -0, і це нормально):

find . -name *foo* -printx | xargs ls -lah (не для Ubuntu)


Це зробило для мене хитрість того, що я міг реально використовувати функції сортування ls, для тих, хто намагається це зробити.
Гаррі Мусто-Плейфайр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.