Ось спрощена версія з розширеним поясненням для початківців, як я, які намагаються навчитися ставити більше однієї команди в один рядок.
Якби ви виписали проблему поетапно, це виглядатиме так:
// 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, ім'я файлу буде надруковано. Якщо ні, то команда рухається далі.
-exec
= цей прапор є опцією в команді find, яка дозволяє використовувати результат якоїсь іншої команди як вираження пошуку. Це як викликати функцію в межах функції.
file {}
= команда викликається всередині find
. file
Команда повертає рядок , яка говорить вам тип файлу файлу. Регулярно, це буде виглядати наступним чином : file mytextfile.txt
. У нашому випадку ми хочемо, щоб він використовував будь-який файл, який розглядається find
командою, тому ми ставимо фігурні дужки, {}
щоб діяти як порожня змінна чи параметр. Іншими словами, ми просто просимо систему вивести рядок для кожного файлу в каталозі.
";"
= цього вимагає find
і розділовий знак в кінці нашої -exec
команди. Щоб отримати додаткові пояснення, перегляньте посібник для "знайти", якщо вам це потрібно, запустітьman find
.
| grep 'ASCII'
= |
- це труба. Труба приймає вихід того, що знаходиться зліва, і використовує його як вхід до того, що знаходиться праворуч. Він бере висновок find
команди (рядок, що є файлом одного файлу) і тестує її, щоб перевірити, чи містить вона рядок 'ASCII'
. Якщо це так, він повертає істину.
ЗАРАЗ вираз праворуч find ./
повернеться true, коли grep
команда поверне true. Вуаля.
find . -type f -exec grep -Il "" {} \;
.