Как я могу направить ввод канала в команду ls?

20

Когда я набираю что-то вроде:

find . -name *foo* | ls -lah

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

Тем не мение:

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

работает хорошо, но только когда у findкоманды есть результаты.

Можно ли пайп к ls?

Lasall
источник
Вам нужно указать, хотите ли вы, чтобы файлы находились внутри каждого результата поиска, или вы хотите, чтобы результаты поиска были непосредственно. Если это последнее, то ответ д / Дениса является правильным ответом.
rmutalik

Ответы:

27

Вы можете использовать -execс findкомандой.

find . -name '*foo*' -exec ls -lah {} \;
Принц Джон Уэсли
источник
Спасибо за ваше решение. Там нет трубы, но это элегантный метод. Если с 'find' не найдено никаких результатов, ничего не отображается (что на самом деле хорошо).
Ласал
7
Немного лучше:find . -name '*foo*' -exec ls -lah {} +
jlliagre
20
find . -name *foo* | xargs -r ls -lah

Это должно работать.

вольнодумцем
источник
1
Спасибо за это решение. Но как я могу бороться с пробелами?
Ласал
2
@Lasall предпочтительным способом является использование поиска -exec +(или -exec \;). xargsБезопасно использовать только с этой -0опцией, что означает, что вы должны указывать любую команду, которую вы передаете, xargsчтобы разделить элементы NULL-байтами (\ 0). С помощью findвы можете сделать это с -print0. xargs -0 и find -print0 не являются стандартными, но -exec есть, поэтому, если переносимость когда-либо будет проблемой, используйте find с -exec.
гейра
4

Попробуй это:

find  . -name *.bak -ls
Деннис
источник
3

Используйте это: (ls может сортировать, работает с именами файлов с пробелами или необычными символами)

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

«-print0» означает, что имена файлов, такие как, file foo 1будут получать выходные данные с findпоследующим нулем. Аргумент "-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 для тех, кто пытается это сделать.
Гарри Mustoe-Playfair