Почему труба не работает с 'find' и 'ls'

Почему конвейер не работает с 'find' и 'ls'? Если я сделаю find . -name *foo* | ls -lah, он выполнит ls для $PWD, а не для вывода find.

Решение, однако, find . -name *foo* | xargs -r ls -alh или может использовать exec.

0
задан 23 May 2016 в 20:22

2 ответа

Консультируйтесь со страницей руководства ls(1)! ls команда берет, это - аргументы на командной строке не на стандартном входе (т.е. дескриптор файла 0).

Когда Вы работаете

<SOME_COMMAND> | ls [OPTIONS...]

Вы даете интерпретатору команд команду создавать канал (|) от стандартный вывод левой команды к стандартному входу правильной команды (здесь: ls). Но ls игнорирует его стандартный вход и осматривает его параметры командной строки, не находя позиционного параметра и перечисляя текущий рабочий каталог (сохраненный в PWD переменная среды интерпретаторами оболочки как Bash) вместо этого.

xargs(1) берет маркеры (разграниченный пробельными символами если не указанный иначе) от его стандартного входного потока, и добавляет их как параметры к командной строке другой команды для выполнения. В Вашем случае, ls управляйте данный xargs получает ряд путей на его командной строке и выполняет его задачу на них, как зарегистрировано руководством.

Премия: опция "команды" -ls к GNU find распечатает пути соответствия подобным способом к ls -dils (см. find(1)).

4
ответ дан 24 May 2016 в 06:22

Другое решение — использовать подстановку команд. Синтаксис: команда опции $(вывод другой команды)

Для этого примера:

ls -lah $(find . -name *foo*)
1
ответ дан 16 November 2020 в 20:11

Другие вопросы по тегам:

Похожие вопросы: