Почему конвейер не работает с 'find' и 'ls'? Если я сделаю find . -name *foo* | ls -lah
, он выполнит ls для $PWD
, а не для вывода find.
Решение, однако, find . -name *foo* | xargs -r ls -alh
или может использовать exec.
Консультируйтесь со страницей руководства ls(1)
! ls
команда берет, это - аргументы на командной строке не на стандартном входе (т.е. дескриптор файла 0).
Когда Вы работаете
<SOME_COMMAND> | ls [OPTIONS...]
Вы даете интерпретатору команд команду создавать канал (|
) от стандартный вывод левой команды к стандартному входу правильной команды (здесь: ls
). Но ls
игнорирует его стандартный вход и осматривает его параметры командной строки, не находя позиционного параметра и перечисляя текущий рабочий каталог (сохраненный в PWD
переменная среды интерпретаторами оболочки как Bash) вместо этого.
xargs(1)
берет маркеры (разграниченный пробельными символами если не указанный иначе) от его стандартного входного потока, и добавляет их как параметры к командной строке другой команды для выполнения. В Вашем случае, ls
управляйте данный xargs
получает ряд путей на его командной строке и выполняет его задачу на них, как зарегистрировано руководством.
Премия: опция "команды" -ls
к GNU find
распечатает пути соответствия подобным способом к ls -dils
(см. find(1)
).
Другое решение — использовать подстановку команд. Синтаксис: команда опции $(вывод другой команды)
Для этого примера:
ls -lah $(find . -name *foo*)