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


20

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

find . -name *foo* | ls -lah

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

Тем не мение:

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

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

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


Вам нужно указать, хотите ли вы, чтобы файлы находились внутри каждого результата поиска, или вы хотите, чтобы результаты поиска были непосредственно. Если это последнее, то ответ д / Дениса является правильным ответом.
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.
гейра


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.