Настройка и работа в Linux



              

Поиск в unix Часть1 - часть 3


Давайте разберемся, что я сейчас сделал. Я создал пустой файл с именем file1 при помощи команды touch. Затем я приказал find поискать в моем текущем каталоге («.») файл с именем («-name») file1 и напечатать («-print») результат поиска на экране. Теперь я могу сказать, что в моем домашнем каталоге и содержащихся в нем подкаталогах, есть лишь один файл с именем file1, так как команда find выдала одну строку с именем найденного файла.

Обычно, мы прибегаем к помощи команды find, когда нам необходимо найти более одного файла. Например вам может понадобиться найти все файлы с определенным расширением. Я имею привычку скачивать большое количество pdf-файлов и, при этом, часто забываю сохранять их в каком-то определенном месте. Иногда я складываю эти файлы в каталог с названием pdfs. Когда меня посещает такое желание, я использую команду find для поиска pdf-файлов во всех подкаталогах моего домашнего каталога: find . -name "*.pdf" -print ./pdfs/50130201a.pdf ./pdfs/50130201b.pdf ./pdfs/50130201c.pdf ./pdfs/IWARLab.pdf ./pdfs/DoS_trends.pdf ./pdfs/Firewall-Guide.pdf ./2000_ports.pdf

Это значит, что я был аккуратен последнее время, так как только один файл не находится в «правильном» подкаталоге.

Заметьте, что для того что бы команда find работала, я заключил образец *.pdf в кавычки, написав "*.pdf", а не просто *.pdf. Существуют еще два способа правильного написания образцов. Эти две команды дадут одинаковый результат: find . -name \*.pdf -print find . -name '*.pdf' -print

Давайте добавлять к этой команде другие команды и смотреть, что в результате получится. Что если нас интересуют только те файлы, которые находятся не в каталоге pdfs? Давайте повторим команду find, но в данном случае переправим ее вывод команде grep, в результате чего мы получим только одно имя: find . -name "*.pdf" -print | grep -v "^\./pdfs/" ./2000_ports.pdf

Отлично, команда работает, однако ее синтаксис выглядит устрашающе. Разберем его по частям. Когда вы используете grep -v, вы создаете инвертированный фильтр. Это значит, что grep будет выбирать из входного потока все строки, в которых НЕ содержится указанный образец. В моем случае, меня не интересуют файлы, которые находятся в каталоге ./pdfs/, я исключаю их используя инверсный фильтр. Обратите внимание, что выражение записано в кавычках. Я так же добавил в фильтр параметр ^\. Символ степени «^» говорит команде grep, что образец надо сравнивать только с началом строки. Обратный слеш «\» нужен для того, что бы команда grep не воспринимала точку «.» как специальный символ. Сложенный вместе, такой образец скажет команде grep, показать мне файлы которые не лежат в каталоге ./pdfs/. Вот таким образом я почил желаемый результат.

Давайте наберемся смелости и сделаем что-нибудь более полезное, чем просто просмотр списка файлов. Попробуем использовать find для того что бы не просто найти необходимые файлы, но и переместить их в правильный каталог: find . -name "*.pdf" -print | grep -v "^\./pdfs/" | xargs -J X mv X ./pdfs/




Содержание  Назад  Вперед