Вот упрощенная версия с расширенным объяснением для начинающих, таких как я, которые пытаются узнать, как поместить более одной команды в одну строку.
Если бы вы записали проблему поэтапно, она выглядела бынапример:
// 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 text'
grep
будет искать ключевое слово 'ASCII' в выходных данных file
Так как мы можемобъединить их в одну строку?Есть несколько способов сделать это, но я считаю, что делать это в порядке нашего псевдокода имеет смысл (особенно для начинающего, такого как я).
find ./ -exec file {} ";" | grep 'ASCII'
Выглядит сложно, но неплохо, когда мы разбиваем его:
find ./
= просматривать каждый файл в этом каталоге.Команда find
выводит имя файла любого файла, который соответствует «выражению», или любой другой, который идет после пути, который в нашем случае является текущим каталогом или ./
Самая важная вещь для пониманияявляется то, что все, что после этого первого бита будет оцениваться как True или False.Если True, имя файла будет распечатано.Если нет, то команда продолжается.
-exec
= этот флаг - опция в команде find, которая позволяет нам использовать результат какой-либо другой команды в качестве выражения поиска.Это похоже на вызов функции внутри функции.
file {}
= команда, вызываемая внутри find
.Команда file
возвращает строку, которая сообщает вам тип файла для файла.Обычно это будет выглядеть так: file mytextfile.txt
.В нашем случае мы хотим, чтобы он использовал любой файл, который просматривается командой find
, поэтому мы помещаем фигурные скобки {}
в качестве пустой переменной или параметра.Другими словами, мы просто просим систему вывести строку для каждого файла в каталоге.
";"
= это требуется для find
и является знаком пунктуации в конце нашей команды -exec
.Обратитесь к руководству для 'find' для получения дополнительных объяснений, если вам это нужно, запустив man find
.
| grep 'ASCII'
= |
- труба.Труба принимает вывод того, что находится слева, и использует его как вход для всего, что находится справа.Он принимает вывод команды find
(строка, которая является типом файла отдельного файла) и проверяет ее, чтобы увидеть, содержит ли она строку 'ASCII'
.Если это так, возвращается true.
NOW, выражение справа от find ./
вернет true, когда команда grep
вернет true.Вуаля.