Вот упрощенная версия с расширенным объяснением для новичков, вроде меня, которые пытаются научиться помещать более одной команды в одну строку.
Если бы вы описали проблему поэтапно, это выглядело бы так:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Для достижения этой цели мы можем использовать три команды UNIX: find
, file
иgrep
.
find
проверит каждый файл в каталоге.
file
предоставит нам тип файла. В нашем случае мы ищем возврат «текста ASCII».
grep
будет искать ключевое слово 'ASCII' в выводе из file
Итак, как мы можем связать их в одну строку? Есть несколько способов сделать это, но я считаю, что выполнение этого в порядке нашего псевдокода имеет наибольший смысл (особенно для новичка вроде меня).
find ./ -exec file {} ";" | grep 'ASCII'
Выглядит сложно, но неплохо, если разобрать:
find ./
= просмотреть все файлы в этом каталоге. Вfind
выводит имя файла любого файла, который соответствует 'выражению' или тому, что идет после пути, который в нашем случае является текущим каталогом или./
Самое важное, что нужно понять, это то, что все, что находится после этого первого бита, будет оцениваться как True или False. Если True, имя файла будет распечатано. Если нет, то команда переходит к следующему.
-exec
= этот флаг - опция в команде find, которая позволяет нам использовать результат какой-либо другой команды в качестве выражения поиска. Это похоже на вызов функции внутри функции.
file {}
= команда, вызываемая внутри find
. Команда file
возвращает строку, которая сообщает вам тип файла. Регулярно, это будет выглядеть следующим образом : file mytextfile.txt
. В нашем случае мы хотим, чтобы он использовал любой файл, просматриваемый find
командой, поэтому мы вставляем фигурные скобки, {}
чтобы они действовали как пустая переменная или параметр. Другими словами, мы просто просим систему выводить строку для каждого файла в каталоге.
";"
= это требуется для find
знака препинания в конце нашей -exec
команды. См. Руководство по поиску для получения дополнительных объяснений, если вам это нужно, запустив man find
.
| grep 'ASCII'
= |
это труба. Pipe принимает вывод того, что находится слева, и использует его как ввод для всего, что находится справа. Он берет выходные данные find
команды (строку, которая является типом файла одного файла) и проверяет его, чтобы увидеть, содержит ли он строку 'ASCII'
. Если да, возвращается истина.
СЕЙЧАС выражение справа find ./
вернет истину, когда grep
команда вернет истину. Вуаля.
find . -type f -exec grep -Il "" {} \;
.