Направление ввода канала в команду ls в Bash

Убунту 17

В области Linux и Unix-подобных операционных систем Bash (Bourne Again SHell) представляет собой мощный инструмент, который позволяет пользователям взаимодействовать с системой и выполнять различные задачи. Одной из наиболее распространенных задач является манипулирование файлами и каталогами, которое часто выполняется с помощью таких команд, как ls и find. Однако объединение этих команд с помощью канала (|) может быть непростым делом, особенно если вы хотите направить вывод одной команды в качестве входных данных для другой. В этой статье мы углубимся в то, как правильно передать вывод команды find команде ls в Bash.

Чтобы направить ввод команды ls в Bash, вы не можете напрямую передать вывод команды find в ls. Вместо этого вы можете использовать команду xargs или опцию -exec команды find. Команда xargs считывает элементы из стандартного ввода и выполняет указанную команду с этими элементами в качестве аргументов, а опция -exec позволяет выполнять команду непосредственно для каждого файла, найденного с помощью find.

Понимание основ

Прежде чем продолжить, важно понять, что делают команды ls и find. Команда ls используется для просмотра содержимого каталога. Он показывает информацию о файлах и каталогах в каталоге. С другой стороны, команда find используется для поиска файлов в иерархии каталогов на основе различных критериев, таких как имя, размер, тип и т. д.

Проблема с подключением к ls

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

находить . -имя *фу* | лс -лах

Однако это не работает так, как ожидалось. Команда ls не читает данные со стандартного ввода (stdin). Вместо этого он ожидает, что имена файлов будут переданы в качестве аргументов. Значит, труба в данном случае не выполняет своего предназначения.

Решение: xargs и -exec

Чтобы правильно передать вывод команды find в ls, нам нужно использовать либо команду xargs, либо опцию -exec команды find.

Использование xargs

Команда xargs считывает элементы из стандартного ввода и выполняет указанную команду с этими элементами в качестве аргументов. Вот как вы можете его использовать:

находить . -name '*foo*' | xargs ls -lah

В этой команде найдите . -name '*foo*' ищет файлы с именем 'foo' в текущем каталоге и его подкаталогах. Вывод этой команды (т. е. имена файлов) затем передается в xargs, который выполняет ls -lah с именами файлов в качестве аргументов. Опция -lah указывает ls отображать подробную информацию о файлах в удобочитаемом формате.

Использование -exec

Опция -exec команды find позволяет выполнить команду непосредственно для каждого найденного файла. Вот как вы можете его использовать:

находить . -name '*foo*' -exec ls -lah {} \;

В этой команде найдите . -name '*foo*' -exec ls -lah {} \; выполняет тот же поиск, что и раньше, но на этот раз ls -lah выполняется непосредственно для каждого найденного файла. {} — это заполнитель для текущего имени файла, а \; указывает на конец команды -exec.

Соображения эффективности

Хотя оба метода работают правильно, следует учитывать соображения эффективности. Метод xargs обычно более эффективен при работе с большим количеством файлов, поскольку он передает в ls несколько имен файлов одновременно. С другой стороны, метод -exec выполняет ls для каждого файла индивидуально, что может быть медленнее.

Заключение

В этой статье мы рассмотрели, как правильно передать вывод команды find команде ls в Bash. Хотя это может показаться простым, важно понимать, что не все команды могут читаться со стандартного ввода и могут потребоваться специальные инструменты, такие как xargs, или такие параметры, как -exec. Как всегда, не забывайте правильно заключать шаблоны файлов в кавычки, чтобы избежать непредвиденного поведения.

Для получения дополнительной информации о командах ls, find и xargs вы можете обратиться к их справочным страницам, набрав man ls, man find или man xargs в своем терминале. Вы также можете посетить GNU Coreutils руководство для более подробного объяснения этих и других команд.

Нет, команда ls не читает данные со стандартного ввода (stdin), поэтому передача вывода find непосредственно в ls не будет работать должным образом.

Чтобы правильно передать вывод команды find в ls, вы можете использовать команду xargs или опцию -exec команды find. Эти методы позволяют передавать имена файлов, найденные командой find, в качестве аргументов ls.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *