Ось спрощена версія з розширеним поясненням для початківців, як я, які намагаються навчитися ставити більше однієї команди в один рядок.
Якби ви виписали проблему поетапно, це виглядатиме так:
// 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 "" {} \;.