- Команда FIND — поиск строки символов в файле
- Утилиты find и findstr — поиск через командную строку
- Утилита find командная строка
- Утилита FINDSTR командная строка
- Поиск файлов через командную строку Windows (один из способов)
- Выводы
- HackWare.ru
- Этичный хакинг и тестирование на проникновение, информационная безопасность
- Команда find: поиск в файловой системе по любым свойствам файла
- Тесты find
- Операторы find
- Предопределённые действия find
- Определённые пользователем действия find
- Улучшаем эффективность
- xargs
- Обработка необычных имён файлов
- Примеры использования find
- Опции find
- Заключение
Команда FIND — поиск строки символов в файле
Команда FIND используется для поиска текстовой строки в одном или нескольких файлах. Если путь не задан, команда FIND выполняет поиск в тексте консоли либо в тексте, переданном по конвейеру другой командой ( в тексте, являющемся выводом команды, выполняющейся в цепочке с FIND ).
Формат командной строки:
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] «строка» [[диск:][путь]имя_файла[ . ]] Параметры команды:
/V — Вывод всех строк, НЕ содержащих заданную строку.
/C — Вывод только общего числа строк, содержащих заданную строку.
/N — Вывод номеров отображаемых строк.
/OFF[LINE] — Не пропускать файлы с установленным атрибутом «Автономный».
/I — Поиск без учета регистра символов.
«строка» — Искомая строка.
[диск:][путь]имя_файла — Один или несколько файлов, в которых выполняется поиск.
FIND /? — выдать справку по использованию команды.
find /I myfile.txt «новость» — выполнить поиск строки новость без учета регистра символов в текстовом файле myfile.txt . По умолчанию, если не задан параметр /I регистр символов учитывается.
find /C myfile.txt «новость» — отобразить общее количество строк, содержащих текст «новость».
FIND /I %TEMP%\*.tmp «windows» — выполнить поиск в каталоге временных файлов для всех файлов с расширением tmp строк , содержащих текст windows без учета регистра символов.
FIND /I %TEMP%\*.tmp «windows» | more — то же, что и в предыдущем примере, но с использованием постраничного вывода на экран.
ipconfig /all | FIND «DNS» — из вывода команды ipconfig /all найти строки, содержащие текст DNS
Обратите внимание, на нехарактерный синтаксис этой команды — строка поиска обязательно заключается в двойные кавычки, поэтому имена и пути файлов, содержащих пробелы, обрабатываются некорректно. Для поиска в таких файлах можно воспользоваться перенаправлением ввода ( символ )
Соответственно, пример с поиском во временных файлах, приведенный выше, в ОС Windows XP ( значение переменной %TEMP% по умолчанию принимает путь с пробелами ) будет выполняться верно при использовании следующей команды:
Естественно, шаблон имени файла *.tmp использовавшийся в примере выше, при перенаправлении ввода применять нельзя ( перенаправление можно выполнять для конкретного файла — textfile.tmp в примере ) и для организации поиска текстовой строки в нескольких файлах можно воспользоваться циклической обработкой их содержимого , например, с помощью команды FOR .
@ECHO OFF
for %%i in («%TEMP%\*.tmp») do FIND %%i «windows»
. . .
Применение команды FIND для поиска строки в результатах вывода другой программы используется, например, для определения доступности сетевого узла с помощью команды PING . Утилита ping.exe не возвращает признак доступности пингуемого адреса в значении переменной ERRORLEVEL (Ненулевое значение ERRORLEVEL утилита ping.exe формирует только в том случае, если заданы ошибочные параметры командной строки). Поэтому, для определения доступности IP- адреса, используется анализ вывода ping.exe, который отличается для доступного и недоступного узла. Так, например, если пингуемый адрес доступен, то в сообщении будет присутствовать значение TTL :
Обмен пакетами с yandex.ru [87.250.250.11] по 32 байт:
Ответ от 87.250.250.11: число байт=32 время=10мс TTL=55
А в случае недоступности, строка символов «TTL» в выводимых результатах отсутствует. Если строка символов «TTL» найдена, то FIND сформирует значение переменной ERRORLEVEL равным 0 Таким образом, для определения факта доступности узла в командном файле можно воспользоваться следующим способом:
ping -n 1 COMPUTER | find /I «TTL» > nul
if %ERRORLEVEL%==0 goto LIVE
ECHO computer не доступен
подпрограмма обработки недоступного состояния
. . .
Exit
:LIVE — начало подпрограммы обработки состояния доступности узла
. . .
. . .
Утилиты find и findstr — поиск через командную строку
В этой статье мы с вами рассмотрим утилиту findstr и find командной строки, которые позволяет производить поиск строк в текстовом документе. Поиск через командную строку можно также настроить, используя шаблоны, которые настраиваются на основе регулярных выражений, но сперва, немного лирики…
В былые времена, когда я был еще полным чайником в компьютерах, мне пришлось услышать про волшебные “виртуальные диски”. В то время размер моего винчестера составлял 2 гигабайта, и на счету был каждый байт, я каждую картинки сжимал для экономии места, зато в системе был один фильм и одна игра “Age Of Empires 2”, я ее уже раз сто проходил. Так вот, я почему то решил, что “виртуальный диск”, это дополнительная память, которая может появится из воздуха… Где то два дня пытался всячески установить через Диспетчер устройств еще один винт на 500 метров, при том, что такого оборудования в системном блоке и подавно не было…
Утилита find командная строка
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] «искомые_значения» [[диск:][путь]имя_файла[ . ]]
И так, смотрим на описание ключей:
[/V] – произвести вывод всех строк, которые НЕ содержат заданной.
[/C] – выводится только общее число строк, содержащих заданную.
[/N] – Вывод номеров отображаемых строк.
[/I] – Поиск без учета регистра символов.
[/OFF[LINE]] – Не пропускать файлы с установленным атрибутом «Автономный».
«искомые_значения» – собственно, строчка, поиск которой производится из командной строки Windows
[[диск:][путь]имя_файла[ . ]] – тут мы прописываем один или несколько имен документов, в которых нужно произвести поиск через командную строку, можно использовать подстановочные знаки.
Хорошо, теперь давайте попробуем написать несколько примеров.
Создадим на диске D:\ папку TEST, в который благополучно поместим три файла с расширениями .pdf, .txt и .mf. Для начала попробуем найти слово «const» во всех документах с расширением txt:
FIND «const» D:\TEST\*.txt
На выходе мы получим следующую информацию:
———- D:TESTSEND_MAIL_DATA.VBS.TXT
соnst toMSg =»to@yandex.ru» ‘получатель
соnst fromMSg =»from@gmail.com» ‘отправитель
соnst subjMsg = «Администратор» ‘субъект
соnst sndUsr =» login» ‘логин
соnst sndPswd =»password» ‘пароль
cоnst smtpSrvr = «smtp.gmail.com» ‘почтовый сервер
———- D:TESTSEND_MAIL_TEXT.VBS.TXT
cоnst toMSg =»to@yandex.ru»
cоnst fromMSg =»from@gmail.com»
cоnst subjMsg = «Администратор»
cоnst sndUsr =» login»
сonst sndPswd =»password»
сonst smtpSrvr = «smtp.gmail.com»
Как видим, мы получили список всех тех строчек, где встречается искомое слово.
Теперь попробуем сделать поиск через командную строку слова “samsung” во всех pdf файлах:
FIND «samsung» D:\TEST\*.pdf
Слово «samsung» встречается в одном документе, но, утилита FІND найти его не смогла, стоит обратить внимание, что и стандартный поиск операционной системы Windows также ничего не нашел, видимо, Google в этом все же больше преуспел.
Теперь попробуем усложнить задачу. Дело в том, что Windows ищет фразу не только в контексте файла, но и в его свойствах. Посмотрим, будет ли утилита find командной строки Windows производить поиск из описания. Я специально, по одному из каждого типа файлов (.pdf, .txt и .mf) вставлю в описание фразу «Victoria Sanremo». И так, приступим:
FIND «Victoria Sanremo» D:\TEST\*.*
В результат выполнения команды find, командная строка ничего не нашла в свойствах документов. Кроме утилиты FІND, есть еще и CMD FINDSTR, которая обладает немного большими возможностями.
Утилита FINDSTR командная строка
Утилита CMD FINDSTR предоставляется возможность осуществить поиск текста через командную строку не только в одном файле, или группе документов заданных по шаблону, но и с возможностью загрузки готового списка. И так, прежде всего, давайте посмотрим на основной синтаксис.
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:файл][/C:строчка] [/G:файл] [/D:список_папок] [/A:цвета] [/OFF[LINE]] «искомые_значения»[[диск:][путь]имя_файла[ . ]]
/B – Данный ключ определяет поиск образца лишь в началах строчек.
/E — Данный ключ определяет поиск образца лишь в конце.
/R – Фразы и слова будут приниматься как регулярные выражения.
/S – Производит поиск файлов через командную строку в текущем каталоге и всех его подпапках.
/I – Данный ключ определяет, что поиск фразы из командной строки будет вестись без учета регистра.
/X – Производит вывод только тех строчек, которые содержат точное совпадение.
/V — Производит вывод только тех строчек, которые не содержат точного совпадения с искомой фразой.
/N — Производит вывод номера строчки (которые содержат точное совпадение) и ее содержимое.
/M — Производит вывод лишь имени документа, который содержит совпадение.
/O – Вывести список найденных строк через пустую строчку.
/P – Данный параметр определяет, что произойдет пропуск всех строк, которые содержат непечатаемые символы.
/OFF[LINE] — Не пропускает те документы, у которых установлен атрибут «Автономный».
/A:цвета – Шестнадцатеричный код цвета, для получения справки можете ввести команду «COLOR /?»
/F:файл – Производит чтение списка файлов из заданного документа.
/C:строчка – Использовать значение данного параметра как искомую фразу поиска.
/G:файл – Позволяет получить список строк из заданного документа.
/D:список_папок – Тут через точку с запятой мы можем задать список каталогов, в которых нужно произвести поиск через командную строку.
“искомые_значения” – Собственно, то, что мы ищем.
[диск:][путь]имя_файла — Задаем путь к документу (документам)
Что бы разделить между собой искомые фразы, между ними вставляется пробел, если параметр не содержит префикса /C. Например,
FINDSTR «Привет мир» data.txt
ищет «Привет» или «мир» в файле data.txt, а команда
FINDSTR /C:»Привет мир» data.txt
ищет фразу «Привет мир» в файле data.txt.
Регулярные выражения являются своеобразным бонусом, которым не то, что оболочка, но и язык программирования не всегда может похвастаться. При поиске из командной строки, регулярные выражения позволяют задавать собственные шаблоны (для справки по некоторым значениям введите в cmd findstr/? ), они также используются в сценариях сервера Windows Script Host, за это отвечает отдельный объект.
Спасибо за внимание. Автор блога Владимир Баталий
Поиск файлов через командную строку Windows (один из способов)
Приветствую, уважаемые участники проекта Habrahabr. Сегодня я хочу рассказать вам как выполнить поиск файлов в интерпретаторе командной строки Windows — cmd.exe. Я не буду вам писать такую команду, как dir или find. Мы сегодня рассмотрим другой, более лучший способ.
Давайте представим такую ситуацию: «Вы начинающий программист, и вам стоит задача: Сделать импорт всех (или некоторых файлов) из определенного каталога. Причем, чтобы можно было искать любые файлы, с любым названием и расширением. При этом импорт должен быть помещен в один файл. С сохранением всех путей файлов, построчно».
Вот как будет выглядеть данный код:
А теперь, давайте разберем, что он делает!
Первая строка кода:
Скрывает все происходящее в командном файле, и параллельно меняет заголовок командной строки.
Вторая строка кода:
Выводит статус операции.
Третья строка кода:
Иницилизация цикла For.
Четвертая строка кода:
Иницилизация цикла If.
Пятая строка кода:
Условие если файл найден.
Восьмая строка кода:
Очистка крана, и вывод конечного сообщения об окончании операции.
Девятая строка кода:
Пауза, перед закрытием пакетного файла и запуск файла с результатами.
Выводы
Условия поиска нужно вводить вручную, и путь где искать
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.
- 22 марта 2021 в 00:07 ТОП 13 ошибок в поиске ключевых слов SEO, которых вы должны избегать
- 18 ноября 2020 в 12:57 Делаем скриншоты с автоматическим перебрасыванием на поиск изображения в Яндекс/Гугл
- 20 февраля 2021 в 23:47 Свободное API для поиска в интернете
- 4 марта 2021 в 16:42 Небольшой скрипт на python для поиска ошибок
- 10 апреля 2021 в 00:49 Поиск максимальной повторяющейся подстроки в символьной строке с помощью SQL
Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.
Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.
Чтобы исключить предвзятость при оценке, все публикации анонимны, псевдонимы показываются случайным образом.
Не надо пропускать:
- рекламные и PR-публикации
- вопросы и просьбы (для них есть Хабр Q&A);
- вакансии (используйте Хабр Карьеру)
- статьи, ранее опубликованные на других сайтах;
- статьи без правильно расставленных знаков препинания, со смайликами, с обилием восклицательных знаков, неоправданным выделением слов и предложений и другим неуместным форматированием текста;
- жалобы на компании и предоставляемые услуги;
- низкокачественные переводы;
- куски программного кода без пояснений;
- односложные статьи;
- статьи, слабо относящиеся к или не относящиеся к ней вовсе.
HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
Команда find: поиск в файловой системе по любым свойствам файла
Если вам нужно очень быстрой найти в вашей системе какой-то файл по имени, то вам поможет команда locate (по ссылке примеры использования и описание опций).
Программа locate может находить файлы на основе исключительно его имени, а программа find ищет по заданной директории (и её субдиректориям) файлы на основе различных атрибутов. Для изучения программы find нужно довольно много времени, поскольку у неё имеется много интересных функций, которые будут востребованы при системном администрировании, исследовании файлов (пример), а также в повседневном использовании.
Данная статья предназначена для тех, кто только начинает знакомиться с командой find. Если вы уже имеете общие представления о find и вас интересует подробная справочная информация по этой программе, то обратитесь к «Переводу мануала find».
В самом простом использовании команде find даётся одно или более имён директорий для поиска. Например, для создания списка содержимого домашней директории:
На самых активных аккаунтах пользователей эта команда выведет огромный список. Поскольку список отправляется в стандартный вывод, мы можем передать его по трубе в другую программу. Давайте задействуем wc для подсчёта количества файлов:
Ух ты, у нас много всего! Прелесть find в том, что она может использоваться для идентификации файлов по определённым критериям. Это делается через (слегка странное) применение опций, тестов и действий. Начнём с обзора тестов.
Тесты find
Допустим из нашего поиска мы хотим список директорий. Чтобы сделать это, мы можем добавить следующий тест:
Добавление -type d ограничивает поиск директориями. Напротив мы можем ограничить поиск обычными файлами следующим тестом:
Список популярных тестов типов файлов, поддерживаемых find:
Тип файла | Описание |
---|---|
b | Специальные блочные файловые устройства |
c | Специальные символьное файловые устройства |
d | Директория |
f | Обычный файл |
l | Символическая ссылка |
Мы также можем искать по размеру файла и имени файла добавив некоторые дополнительные тесты: допустим мы ищем обычные файлы, которые соответствуют шаблону с подстановочными символами «*.JPG» и размером более чем один мегабайт:
В этом примере мы добавили тест -name за которым следует шаблон с подстановочным символом. Обратите внимание, как мы заключили его в кавычки для предотвращения раскрытия оболочкой пути имени. Далее мы добавили тест -size за которым следует строка «+1M». Начальный знак плюс говорит о том, что мы ищем файлы большего размера чем указанное число. Начальный знак минус изменил бы значение строки на поиск менее чем указанный размер. Отсутствие знака означает «точное соответствие величине». Завершающая буква «M» говорит, что единица измерения указана в мегабайтах. Для указания единиц измерения могут использоваться следующие символы:
Символ | Единица |
---|---|
b | 512-байтовые блоки. Это значение по умолчанию если единица измерения не указана. |
c | Байты |
w | 2-байтные слова |
k | Килобайты (состоит из 1024 байтов) |
M | Мегабайты (состоит из 1048576 байтов) |
G | Гигабайта (состоит из 1073741824 байтов) |
find поддерживает большое количество различных тестов. Ниже краткое изложение популярных. Помните, в случаях, когда требуется числовой аргумент, может быть применена описанная выше нотация с «+» и «—»:
Тест | Описание |
---|---|
-cmin n | Соответствует файлам или директориям, чьё содержимое или атрибуты были изменены последний раз ровно n минут назад. Для указания менее чем n минут назад, используйте -n, а для указания более чем n минут назад, используйте +n. |
-cnewer файл | Соответствует файлам или директориям, чьё содержимое или атрибуты было изменено более недавно, чем этот файл. |
-ctime n | Соответствует файлам или директориям, чьё содержимое или атрибуты было изменено n*24 часов назад. |
-empty | Соответствует пустым файлам и директориям. |
-group группа | Соответствует файлам и директориям, принадлежащим группе. Группа может быть выражена как имя группы или как числовой ID группы. |
-iname шаблон | Похоже на тест -name, но без учёта регистра. |
-inum n | Соответствует файлам с номером иноды n. Это полезно для поиска всех жёстких ссылок на определённую иноду. |
-mmin n | Соответствует файлам или директориям, чьё содержимое было изменено n минут назад. |
-mtime n | Соответствует файлам и директориям, чьё содержимое было изменено n*24 часов назад. |
-name шаблон | Соответствует файлам и директориям, подходящим под указанный шаблон в котором можно использовать подстановочные символы. |
-newer файл | Соответствует файлам и директориям, чьё содержимое было изменено недавнее, чем указанный файл. Это очень полезно при написании шелл скрипта, который выполняет резервное копирование. Каждый раз, когда вы делаете резервную копию, скрипт обновляет файл (такой как журнал) и затем используете find для определения, какие файлы были изменены после последнего обновления. |
-nouser | Соответствует файлам и директориям, которые не принадлежат валидному пользователю. Это может использоваться для поиска файлов, принадлежащих удалённым учётным записям или для выявления активности атакующих. |
-nogroup | Соответствует файлов и директорий, которые не принадлежат валидной группе. |
-perm режим | Соответствует файлам или директориям, которые имеют права доступа, установленные на режим. Режим можно выразить восьмеричным или символическим обозначением. |
-samefile имя | Похоже на тест -inum. Соответствует файлам, которые разделяют один и тот же номер иноды как имя файла. |
-size n | Соответствует файлам размера n. |
-type c | Соответствует файлам типа c. |
-user имя | Соответствует файлам или директориям, принадлежащим имени пользователя. Пользователя можно выразить именем пользователя или числовым ID пользователя. |
Это не полный список. Страница man содержит все подробности.
Операторы find
Даже со всеми тестами, которые предоставляет find, нам всё ещё может понадобиться лучший способ описать логические взаимоотношения между тестами. Например, что если нам нужно определить, имеют ли все файлы и поддиректории в директории безопасные разрешения (права доступа)? Нам бы хотелось найти все файлы с разрешениями отличными от 0600 и директории с разрешениями отличными от 0700. К счастью, find предоставляет способ комбинировать тесты используя логические операторы для создания более сложных логических взаимоотношений. Для выражения вышеупомянутого теста мы можем сделать так:
Команда запуска может показаться странной. На самом деле операторы не такие уж и сложные после того, как вы их узнаете. Вот их список:
Оператор | Описание |
---|---|
-and | Соответствие, если тесты с обоих сторон оператора являются истинной. Может быть сокращён до -a. Обратите внимание, что когда оператор отсутствует, по умолчанию применяется -and. |
-or | Соответствие, если тест с какой-либо стороны оператора является истинной. Может быть сокращён до -o. |
-not | Соответствие, если тест, следующий за оператором, является ложью. Может быть кратко записан восклицательным знаком (!). |
( ) | Группирует вместе тесты и операторы для формирования больших выражений. Это используется для управления приоритетом логических вычислений. По умолчанию find вычисляет слева направо. Часто необходимо переписать стандартный порядок вычисления для получения желаемого результата. Даже если это ненужно, иногда полезно включать символы группировки для улучшения читаемости команд. Обратите внимание, что поскольку символы круглых скобок имеют специальное значение для оболочки, то при использовании в командной строке, чтобы они могли быть переданы в find как аргумент, они должны быть заключен в кавычки. Обычно для их экранизации используется символ обратного слеша. |
Теперь, освоим этот список операторов, давайте проанализируем нашу команду find. При просмотре с самого верхнего уровня, мы видим, что наши тесты организованы в две группы, разделённые оператором -or:
Это имеет смысл, поскольку мы ищем файлы с определённым набором разрешений и директории с другим набором. Если мы ищем файлы и директории, почему вместо -and мы не используем -or? Потому что find сканирует файлы и директории, каждые из которых оцениваются на соответствие специфичным тестам. Мы хотим знать, это файл с плохими разрешениями или это директория с плохими разрешениями. Эти условия не могут быть истинными одновременно. Если мы раскроем выражения в группах, мы сможем увидеть это следующим образом:
Наш следующий вызов – как протестировать на «плохие разрешения». Как мы это делаем? На самом деле мы это не делаем. В действительности мы тестируем на «отсутствие хорошего разрешения», поскольку мы знаем, чем являются «хорошие разрешения». В случае файлов мы определяем хорошие как 0600, а для директорий как 0700. Выражение, которое будет тестировать файлы на «не хорошие» разрешения это:
и для директорий:
Как отмечено выше в таблице операторов, оператор -and может быть безопасно удалён, поскольку он применяется по умолчанию. Итак, если мы сложим всё вместе, мы получим нашу конечную команду:
Тем не менее, поскольку круглые скобки имеют специальное значение для оболочки, мы должны экранировать их, чтобы не дать оболочке их интерпретировать. Этот эффект достигается добавления перед каждой из них символа обратного слеша.
Имеется другая особенность логических операторов, которую важно понимать. Допустим у нас имеется два выражения, разделённых логическим оператором:
Во всех случаях expr1 всегда будет выполняться; при этом оператор будет определять, выполняется ли expr2. Как это работает объясняется в таблице логики find И/ИЛИ:
Результат expr1 | Оператор | expr2 |
---|---|---|
True | -and | Всегда выполняется |
False | -and | Никогда не выполняется |
True | -or | Никогда не выполняется |
False | -or | Всегда выполняется |
Почему это делается? Это делается для улучшения производительности. Возьмём, к примеру, -and. Мы знаем, что выражение expr1 -and expr2 не может быть истиной, если результат expr1 является ложью, поэтому нет смысла выполнять expr2. Похожим образом, если у нас имеется выражение expr1 -or expr2 и результат expr1 является истинной, нет смысла выполнять expr2, поскольку мы уже знаем, что выражение expr1 -or expr2 является истиной.
Хорошо, это помогает более быстрой работе. Почему это так важно? Это важно, поскольку мы можем положиться на это поведения для управления выполняемыми действиями, с которыми мы сейчас познакомимся.
Предопределённые действия find
Пусть команда find поработает на нас! Получить список результатов от нашей команды find это полезно, но что, если в действительности нам нужно совершить с пунктами списка действие. К счастью find позволяет выполнять действия на основе результатов поиска. Имеется набор предопределённых действий и несколько способов использования пользовательских действий. Начнём с осмотра нескольких предопределённых действий:
Действие | Описание |
---|---|
-delete | Удалить текущий подошедший файл. |
-ls | Выполняет эквивалент ls -dils на подошедшем файле. Вывод отправляется в стандартный вывод. |
Вывод полного пути подошедшего файла в стандартный вывод. Это действие по умолчанию, если не указано другое действие. | |
-quit | Выйти, как только найден подошедший файл. |
Как и с тестами, имеется намного больше действий. Смотрите страницу man для дополнительных подробностей. В нашем самом первом примере мы делали:
что создавало список каждого файла и субдиректории, содержащихся внутри нашей домашней директории. Команда создала список, поскольку если не указано другого действия, то применяется действие -print. Следовательно, наша команда также может быть выражена так:
Мы можем использовать find для удаления файлов, которые соответствуют определённому критерию. Например, для удаления файлов, которые имеют расширение «.BAK» (оно часто используется для обозначения файлов резервных копий) мы могли бы использовать эту команду:
В этом примере каждый файл в домашней пользовательской директории (и её поддиректориях) ищется по имени файла, оканчивающегося на .BAK. Когда они находятся, они удаляются.
Предупреждение: излишне говорить, что вы должны быть крайне осторожны при использовании действия -delete. Всегда начинайте с тестирования команды, подставив действие -print перед тем, как запустить команду с -delete, чтобы подтвердить результаты поиска.
Перед тем как двигаться дальше, давайте ещё раз взглянем, как логические операторы влияют на действия. Изучите следующую команду:
Как мы увидели, эта команда будет искать любой обычный файл (-type f), чьё имя заканчивается на .BAK (-name ‘*.BAK’) и выведет в стандартный вывод относительный путь имени файла каждого соответствующего файла (-print). Тем не менее, причина того, что команда работает так, как работает, определена логическими взаимоотношениями между каждыми тестами и действиями. Помните, по умолчанию применяется отношение -and между каждым тестом и действием. Мы также можем выразить команду таким способом, чтобы логические взаимоотношения было проще увидеть:
Полностью выразив нашу команду, давайте разберёмся, как логические операторы влияют на её выполнение:
Тест/Действие | Выполняется только если… |
---|---|
-type f и -name ‘*.BAK’ являются true | |
-name ‘*.BAK’ | -type f является true |
-type f | Всегда выполняется, поскольку это является первым тестом/действием в связке -and |
Поскольку логическое отношение между тестами и действиями определяет, которое из них выполняется, мы можем видеть, что порядок тестов и действий важен. Например, если бы мы изменили порядок тестов и действий так, что действие -print было бы первым, команда вела бы себя по-другому:
Эта версия команды будет печатать каждый файл (действие -print всегда сводится к истине) и затем тестировать тип файла и указанное файловое расширение.
Определённые пользователем действия find
В дополнении к предопределённым действия, мы также можем вызывать произвольные команды. Традиционным способом сделать это является действие -exec. Это действие работает примерно так:
где команда – это имя команды, <> – это символическое представление текущего имени файла, а точка с запятой – это требуемый разделитель, показывающий конец команды. Вот пример использования -exec для работы как действие -delete, описанное выше:
И опять, поскольку фигурные скобки и точка с запятой имеют специальное значение для оболочки, они должны быть заключены в кавычки или экранированы.
Также возможно выполнить определённое пользователем действие интерактивно, используя действие -ok на месте -exec, у пользователя перед выполнением каждой указанной команды будет делаться запрос:
В этом примере мы ищем файлы с именами, начинающимися со строки «foo» и выполняем команду ls -l каждый раз, когда один из файлов найден. Используя действия -ok приводит к запросу у пользователя перед выполнением команды ls.
Улучшаем эффективность
Когда используется действие -exec, оно запускает новый экземпляр указанной команды каждый раз, когда найден совпадающий файл. Бывают случаи, когда нам нужно собрать все результаты поиска и запустить один экземпляр команды. Например, вместо запуска команды таких образом:
мы предпочли бы выполнить её так:
т.е. выполнить один раз, а не несколько. Имеется два способа сделать это. Традиционный способ – использование команды xargs – и альтернативный способ, используя новую функцию в самой find. Начнём с рассмотрения альтернативного способа.
Изменив конечный символ точки с запятой на знак плюс, мы активируем возможность find комбинировать результаты поиска в список аргументов для единичного выполнения желаемой команды. Вернёмся к нашему примеру, это:
будет выполнять ls каждый раз, когда найден файл. Изменив команду на:
мы получаем тот же результат, но система должна выполнить команду ls только один раз.
xargs
Команда xargs выполняет интересную функцию. Она принимает ввод из стандартного ввода и конвертирует его в список аргументов для указанной команды. В нашем примере мы могли бы использовать её примерно так:
Здесь мы видим вывод команды find, переданный по трубе xargs, которая, в свою очередь, конструирует список аргументов для команды ls и затем выполняет её.
Примечание: хотя число аргументов, которое может быть помещено в командную строку, весьма большое, оно не является безграничным. Возможно создать команды, которые являются слишком большими, чтобы их могла принять оболочка. Когда строка команды превышает максимальную поддерживаемую системой длину, xargs выполняет указанную команду с максимальным числом возможных аргументов, а затем повторяет этот процесс пока стандартный вывод не закончится. Чтобы увидеть максимальный размер строки команды, выполните xargs с опцией —show-limits.
Обработка необычных имён файлов
Unix-подобные системы позволяют включать пробелы (и даже символ новой строки!) в имена файлов. Это вызывает проблемы в программах вроде xargs, которая конструирует списки аргументов для других программ. Внедрённый пробел будет истолкован как разделитель и конечная команда интерпретирует каждое разделённое пробелом слово как отдельный аргумент. Чтобы обойти это, find и xarg позволяют опциональное использование символа null в качестве разделителя аргументов. Символ null определён в ASCII как символ, представленный нулём (в отличие, например, символа пробела, который определён в ASCII как символ, представленный числом 32). Команда find предоставляет действие -print0, которое производит вывод с null в качестве разделителя, а команда xargs имеет опцию —null, которая принимает ввод с разделителем null. Пример:
Используя эту технику, мы можем быть уверены, что все файлы, даже содержащие внедрённые пробелы в их именах, обработаются корректно.
На следующем примере видно, что первоначальный вариант вызвал ошибки, которые удалось избежать во второй команде, использующей эту технику:
Примеры использования find
Настало время задействовать find в (почти) практическом использовании. Давайте создадим полигон для тренировки только что полученных знаний.
Нашим небольшим полигоном будет директория playground с множеством поддиректорий и файлов:
Это неплохой пример силы командной строки. Двумя строчками мы создали директорию playground, содержащую 100 поддиректорий, каждая из которых содержит по 26 пустых файла. Попробуйте это сделать в графическом интерфейсе!
Метод, которым мы воспользовались, задействует команду mkdir, раскрытие выражений оболочки (а именно раскрытие фигурных скобок) и команду touch. Комбинируя mkdir с опцией -p (которая говорит mkdir создавать отсутствующие родительские директории если они отсутствуют для указанных путей – конечных каталогов, которые нужно создать) и раскрытие фигурных скобок, мы были способны создать 100 поддиректорий.
Команда touch обычно используется для установки или обновления времени доступа, изменения и модификации файлов. Тем не менее, если в качестве аргумента указано имя файла, который не существует, то создаётся пустой файл.
На нашем полигоне мы создали 100 экземпляров файла под именем file-A. Давайте найдём их:
Обратите внимание, что в отличие от ls, find не создаёт результаты в отсортированном порядке. Этот порядок определён разметкой устройства хранения. Мы можем подтвердить, что у нас на самом деле 100 экземпляров файлов следующим образом:
Далее давайте взглянем на найденные файлы на основе их времени модификации. Это будет полезно при создании резервных копий или организации файлов в хронологическом порядке. Чтобы сделать это, мы создадим эталонный файл по сравнению с которым мы будем сравнивать время модификации:
Эта команда создаёт пустой файл с именем timestamp и устанавливает время модификации на текущее время. Мы можем проверить это используя другую полезную команду – stat – которая является «форсированной» версией команды ls. Команда stat раскрывает всё, что система понимает о файле и его атрибутах:
Если мы снова коснёмся (touch) файла и проверим его с stat, мы увидим, что время доступа, модификации, изменения обновились:
Далее давайте используем find для обновления некоторых файлов на нашем полигоне:
Это обновит все файлы на полигоне с именем file-B. Далее мы будем использовать find для выявления обновлённых файлов, сравнивая все файлы с эталонным файлом timestamp:
Результат содержит 100 экземпляров файла file-B. Поскольку мы выполнили touch на всех файлах с именем file-B на полигоне, после обновления timestamp они теперь «новее» чем timestamp и, следовательно, могут быть найдены с помощью теста -newer.
Наконец, давайте вернёмся к тесту на плохие разрешения (права доступа), который мы выполняли ранее, и применим его к нашему полигону:
Команда выведет 100 директорий и 2600 файлов (а также timestamp и саму playground, т.е. всего 2702), поскольку ни один из них не соответствует определению «хорошие разрешения». С нашими знаниями операторов и действий, мы можем добавить действия к этой команде для применения новых разрешений к файлам и директориям на полигоне:
В повседневной жизни для нас может быть проще напечатать две команды вместо этой одной большой составной команды: одну для директорий, а другую для файлов. Но всё равно нужно быть знакомым с разными способами вызова команды. Важным здесь является понимать, как операторы и действия могут использоваться вместе для выполнения полезных задач.
Опции find
Наконец мы добрались до опций. Опции используются для управления областью видимости поиска find. Они могут быть включены с другими тестами и действиями при конструировании выражений find. Это список самых часто используемых опций find:
Опция | Описание |
---|---|
-depth | Указывает find обрабатывать файлы директорий перед самими директориями. Эта опция автоматически применяется, когда указано действие -delete. |
-maxdepth levels | Установление максимального числа уровней, на которое find будет спускаться по дереву директорий перед применением тестов и действий. |
-mindepth levels | Установить минимальное число уровней, на которое find будет спускаться по дереву директорий перед применением тестов и действий. |
-mount | Указать find не лазить по директориям, которые смонтированы на других файловых системах. |
-noleaf | Указывает find не оптимизировать её поиск на основе предположения, что она ищет на Unix-подобной файловой системе. Это необходимо при сканировании файловых систем DOS/Windows и CD-ROM. |
Заключение
Если вы уже познакомились с locate, то легко заметить, что locate настолько же легка, насколько сложна find. Обе эти программы имеют своё применение. Найдите время для изучения find и её многочисленных возможностей. Это может, наряду с обычным использованием, улучшить ваше понимание операций файловой системы Linux.
Если вы успешно освоили материал из этого урока, для углублённого изучения опций, посмотрите перевод манула find.