Linux как найти файл по маске
Используйте утилиту find для поиска файлов в дереве каталогов по имени файла. Укажите имя дерева каталогов для поиска, а затем, с помощью опции `-name’ — имя нужного Вам файла.
Чтобы увидеть список всех файлов системы, которые называются `top’, наберите:
$ find / -name top [Enter]
Эта команда проведет поиск во всех каталогах, куда Вам разрешен доступ; если Вы не имеете прав прочесть содержимое каталога, find сообщить, что поиск в данном каталоге Вам запрещен.
Опция `-name’ различает прописные и строчные буквы; чтобы использовать поиск без этих различий, воспользуйтесь опцией `-iname’.
Чтобы увидеть список всех файлов системы, которые называются `top’, без учета регистра символов, наберите:
$ find / -iname top [Enter]
Эта команда найдет все файлы, название которых состоит из букв `top’ — включая `Top’, `top’, и `TOP’.
Для поиска файлов, имена которых совпадают с определенным образцом, удобно использовать метасимволы. Образцы имен нужно указывать в одинарных кавычках.
Чтобы получить список файлов системы, имена которых начинаются с букв `top’, введите:
$ find / -name ‘top*’ [Enter]
Чтобы получить список файлов системы, имена которых начинаются с букв `top’, за которыми следуют еще три символа, введите:
$ find / -name ‘top. ‘ [Enter]
Чтобы получить список файлов системы, имена которых начинаются с букв `top’, за которыми следуют пять и более символов, введите:
$ find / -name ‘top. *’ [Enter]
Чтобы увидеть все файлы с расширением `.tex’в Вашем рабочем каталоге, независимо от их написания, введите:
-iname ‘*.tex’ [Enter]
Чтобы увидеть все файлы в каталоге `/usr/share’, содержащие в имени слово `farm’, введите:
$ find /usr/share -name ‘*farm*’ [Enter]
Используйте `-regex’ вместо `-name’ для поиска файлов, имена которых удовлетворяют регулярному выражению, или образцу, описывающему несколько строк.
Чтобы увидеть все файлы в текущем каталоге, имена которых содержат строку `net’ или `comm’, наберите:
Примечание: Опция `-regex’ совпадает с полным именем файла относительно указанного каталога, а не с отдельным именем файла.
Чтобы найти файлы определенного размера, используйте опцию `-size’, указав после нее требуемый размер файла. Размер файла может быть задан в трех различных формах: если перед ним указан знак плюс (`+’), ищутся все файлы, большие, чем указанный размер; если указан знак минус (`-‘), ищутся все файлы, меньшие, чем указанный размер; если префикс не указан, ищутся файлы точно указанного размера. (Единица измерения — блок 512 байт; символ `k’ после размера указывает килобайты, символ `b’ — байты.)
Чтобы вывести список файлов в каталоге `/usr/local’, размер которых больше 10,000 килобайт, введите:
$ find /usr/local -size +10000k [Enter]
Чтобы вывести список файлов в домашнем каталоге, размер которых меньше 300 байт, введите:
-size -300b [Enter]
Чтобы вывести список файлов системы, размер которых составляет 42 блока по 512 байт, наберите:
$ find / -size 42 [Enter]
Используйте опцию `-empty’ для поиска пустых файлов — т.е. файлов с размером 0 байт. Это полезно для поиска и удаления ненужных файлов.
Чтобы найти все пустые файлы в Вашем домашнем каталоге, введите:
Чтобы найти файлы, модифицированные в определенное время, используйте команду find с опциями `-mtime’ или `-mmin’; аргумент опции `-mtime’ определяет количество прошедших суток (24 часа), а аргумент `-mmin’ — количество прошедших минут.
Чтобы вывести все файлы в каталоге `/usr/local’, модифицированные точно 24 часа назад, введите:
$ find /usr/local -mtime 1 [Enter]
Чтобы вывести все файлы в каталоге `/usr’, модифицированные 5 минут назад, введите:
$ find /usr -mmin 5 [Enter]
Если Вы хотите указать промежуток времени, поставьте перед числом либо знак плюс (`+’), определяя большее или равное аргументу время, или знак минус (`-‘), определяя время, меньшее или равное аргументу.
Чтобы вывести все файлы в каталоге `/usr/local’, модифицированные в течение последних 24 часов, введите:
$ find /usr/local -mtime -1 [Enter]
Опция `-daystart’ определяет отсчет времени с момента начала текущих суток.
Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные вчера, введите:
-mtime 1 -daystart [Enter]
Чтобы вывести все файлы в каталоге `/usr’, модифицированные в течение года, введите:
$ find /usr -mtime +356 -daystart [Enter]
Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные в период от 2 до 4 дней тому назад, наберите:
-mtime 2 -mtime -4 -daystart [Enter]
Чтобы найти файлы, которые новее некоторого файла, введите его имя в качестве аргумента опции `-newer’.
Чтобы вывести все файлы в каталоге `/etc’, которые новее файла `/etc/motd’, введите:
$ find /etc -newer /etc/motd [Enter]
Чтобы найти все файлы новее определенной даты, используйте следующий трюк: создайте временный файл в каталоге `/tmp’ и установите дату его модификации на требуемую с помощью touch, а затем поределите его как аргумент для `-newer’.
Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные после 4 мая текущего года, введите:
Чтобы найти файлы, принадлежащие определенному пользователю, укажите имя пользователя в качестве агрумента опции `-user’. Например, для поиска всех файлов в каталоге `/usr/local/fonts’, принадлежащих пользователю warwick, наберите:
$ find /usr/local/fonts -user warwick [Enter]
Опция `-group’ подобным образом определяет файлы, принадлежащие некоторой группе пользователей.
Чтобы вывести список файлов в каталоге `/dev’, принадлежащих группе audio, введите:
$ find /dev -group audio [Enter]
Вы можете использовать команду find для выполнения других команд над найденными файлами, указав требуемые команды в качестве аргуентов опции `-exec’. Если Вы используететв команде строку `»’, эта строка в команде будет заменена именем текущего найденного файла. Окончание команды помечается строкой `’;».
Чтобы найти все файлы в каталоге ` /html/’ с расширением `.html’, и вывести строки из этих файлов, содержащие слово `organic’, введите:
/html/ -name ‘*.html’ -exec grep organic ‘<>‘ ‘;’ [Enter]
Чтобы ввести подтверждение выполнения команды для файла, найденного find, используйте ключ `-ok’ вместо `-exec’.
Чтобы удалить из Вашего домашнего каталога файлы, доступ к которым осуществлялся более года назад, с подтверждением для каждого файла, введите:
-used +365 -ok rm ‘<>‘ ‘;’ [Enter]
Вы можете определить несколько опций find одновременно, чтобы найти файлы, удовлетворяющие сразу нескольким критериям.
Чтобы вывести список файлов в Вашем домашнем каталоге, имена которых начинаются со строки `top’, и которые новее файла `/etc/motd’, введите:
-name ‘top*’ -newer /etc/motd [Enter]
Чтобы сжать все файлы в Вашем домашнем каталоге, размер которых превышает 2 Mb, и которые еще не сжаты с помощью gzip (не имеют расширения `.gz’), введите:
-size +2000000c -regex ‘.*[^gz]’ -exec gzip ‘<>‘ ‘;’ [Enter]
Чтобы найти наибольший файл в каталоге, используйте команду ls с опцией `-S’, которая сортирует файлы в нисходящем порядке по размеру (обычно ls выводит список файлов по алфавиту). Добавьте опцию `-l’, чтобы вывести размер и другие атрибуты файла.Пример:
Чтобы вывести оглавление каталога, начав с файлов наименьшего размера, используйте ls с ключами `-S’ и `-r’, которые сортируют вывод в обратном порядке.Пример:
Чтобы вывести список каталогов, отсортированных по размеру — то есть размеру всех содержащихся в них файлов — используйте du и sort. Команда du выводит список каталогов в восходящем порядке, начиная с самого маленького; опция `-S’ помещает при выводе в первую колонку размер каталога в килобайтах. Укажите требуемое дерево каталогов в качестве аргумента du и перенаправьте вывод в команду sort с ключом `-n’, которая отсортирует список по числам.
Чтобы вывести список подкаталогов в текущем дереве каталогов, отсортированный по размеру, введите:
$ du -S . sort -n [Enter]|
Если Вам нужно, чтобы первыми были указаны самые большие каталоги, используйте ключ `-r’:
$ du -S . sort -nr [Enter]|
Чтобы быстро определить количество файлов в каталоге, используйте ls и перенаправьте вывод в команду `wc -l’, которая выволит количество строк, пришедших на ее вход.
Для вывода общего количества файлов в текущем каталоге введите:
Общее количество файлов — 19.
Поскольку ls по умолчанию не показывает скрытые файлы, приведенная выше команда не будет их учитывать. Опция `-A’ для ls позволит посчитать обычные и скрытые файлы:
Чтобы посчитать количество файлов во всем дереве каталогов, а не только в отдельном каталоге, используйте find вместо ls, и укажите специальный ключ для find — строку `
! -type d’, чтобы исключить вывод и подсчет каталогов.
Чтобы вывести количество файлов в дереве `/usr/share’, введите:
$ find /usr/share \! -type d wc -l [Enter]|
Чтобы вывести количество файлов и каталогов в дереве `/usr/share’, введите:
$ find /usr/share wc -l [Enter]|
Чтобы вывести количество каталогов в дереве `/usr/share’, введите:
$ find /usr/share \! -type f wc -l [Enter]|
Команда which позволяет Вам получить полный путь к приложению или другой команде, указав базовое имя файла в качестве опции. Это удобно, чтобы убедиться, что данное приложение или команда присутствуют в системе.
Чтобы определить, установлен ли в Вашей системе perl и где он расположен, введите:
Next: Средства управления файлами Up: Средства поиска файлов Previous: Поиск файлов с помощью Contents Index Alex Otwagin 2002-12-16
Источник
Linux как найти файл по маске
В этой заметке речь пойдет о наборе исходников, известном в проекте GNU как findutils. И в первую голову — о команде find (как, впрочем, и о тесно связанной с ней команде xargs). Столь высокая честь выпадает им потому, что посредством этих двух команд можно решить если не все, то большинство (Buono Parte) проблем, возникающих при работе с файлами.
Кроме find и xargs, в состав набора findutils входят также команды locate и updatedb, о которых говорилось ранее, а также команды bigram, code, frcode, реального приложения которых я, честно говоря, не знаю (и, соответственно, говорить о них не буду).
Итак, файловый апофигей — команда find. Строго говоря, вопреки своему имени, команда эта выполняет не поиск файлов как таковой, но — рекурсивный обход дерева каталогов, начиная с заданного в качестве аргумента, отбирает из них файлы в соответствие с некоторыми критериями и выполняет над отбракованным файловым хозяйством некоторые действия. Именно эту ее особенность подчеркивает резюме команды find, получаемое (в некоторых системах) посредством
что применительно случаю можно перевести как «прогулка по файловой системе».
Команда find по своему синтаксису существенно отличается от большинства прочих Unix-команд. В обобщенном виде формат ее можно представить следующим образом:
Аргумент — это путь поиска, то есть каталог, начиная с которого следует искать файлы, например, корневой
или домашний каталог пользователя
Опция поиска — критерий, по которому следует искать файл (файлы). В качестве таковых могут выступать имя файла (-name), его тип (-type), атрибуты принадлежности, доступа или времени.
Ну а опция действия определяет, что же надлежит сделать с найденным файлом или файлами. А сделать с ними, надо заметить, можно немало — начиная с вывода на экран (-print) и кончая передаче в качестве аргументов любой другой команде (-exec).
Как можно заметить, опция поиска и опция действия предваряются знаком дефиса, значение первой отделяется от ее имени пробелом.
Однако начнем по порядку. Опции поиска команды find позволяют выполнить вышеозначенный поиск по следующим критериям (символ дефиса перед опциями ниже опущен, но не следует забывать его ставить):
- name — поиск по имени файла или по маске имени; в последнем случае метасимволы маски должны обязательно экранироваться (например, — name *.tar.gz) или заключаться в кавычки (одинарные или двойные, в зависимости от правил, принятых для данной командной оболочки; этот критерий чувствителен к регистру, но близкий по смыслу критерий iname позволяет производить поиск по имени без различения строчных и заглавных букв;
- type — поиск по типу файла; этот критерий принимает следующие значения — f (регулярный файл), d (каталог), s (символическая связь), b (файл блочного устройства), c (файл символьного устройства);
- user и group — поиск по имени или идентификатору владельца или группы, выступающим в качестве значения критерия; существует также критерии nouser и nogroup — они отыскивают файлы, владельцев не имеющие (то есть тех, учетные записи для которых отсутствую в файлах /etc/passwd и /etc/group); эти критерии в значения, разумеется, не нуждаются;
- size — поиск по размеру, задаваемому в виде числа в блоках или в байтах — в виде числа с последующим символом c; возможны значения n (равно n блоков), +n (более n блоков), -n (менее n блоков);
- perm — поиск файлов по значениям их атрибутов доступа, задаваемых в символьной форме;
- atime, ctime, mtime — поиск файлов с указанными временными атрибутами; значения временных атрибутов указываются в сутках (точнее, в периодах, кратных 24 часам); возможны формы значений этих атрибутов: n (равно указанному значению n*24 часа), +n (ранее n*24 часа), -n (позднее n*24 часа);
- newer — поиск файлов, созданных после файла, указанного в качестве значения критерия (то есть имеющего меньшее значение mtime);
- maxdepth и mindepth позволяют конкретизировать глубину поиска во вложенных подкаталогах — меньшую или равную численному значению для первого критерия и большую или равную — для второго;
- depth — производит отбор в обратном порядке, то есть не от каталога, указанного в качестве аргумента, а с наиболее глубоко вложенных подкаталогов; смысл этого действия — получить доступ к файлам в каталоге, для которого пользователь не имеет права чтения и исполнения;
- prune — позволяет указать подкаталоги внутри пути поиска, в которых отбора файлов производить не следует.
Кроме этого, существует еще одна опция поиска — fstype, предписывающая выполнять поиск только в файловой системе указанного типа; очевидно, что она может сочетаться с любыми другими опциями поиска. Например, команда
будет искать файлы, имеющие отношение к оболочке Z-Shell, начиная с корня, но только — в пределах тех разделов, на которых размещена файловая система Ext3fs (на моей машине — это именно чистый корень, за вычетом каталогов /usr, /opt, /var, /tmp и, конечно же, /home.
Критерии отбора файлов могут группироваться практически любым образом. Так, в форме
она выберет в домашнем каталоге пользователя все компрессированные архивы, созданные после файла с именем filename. По умолчанию между критериями отбора предполагается наличие логического оператора «И». То есть будут искаться файлы, удовлетворяющие и маске имени, и соответствующему атрибуту времени. Если требуется использование оператора «ИЛИ», он должен быть явно определен в виде дополнительной опции -o между опциями поиска. Так, команда:
призвана отобрать файлы, созданные менее двух суток назад, или же — позднее, чем файл filename.
Особенность GNU-реализации команды find (как, впрочем, и ее тезки из числа BSD-утилит) — то, что она по умолчанию выводит список отобранных в соответствии с заданными критериями файлов на экран, не требуя дополнительных опций действия. Однако, как говорят, в других Unix-системах (помнится, даже и в некоторых реализациях Linux) указание какой-либо из таких опций — обязательно. Так что рассмотрим их по порядку.
Для выведения списка отобранных файлов на экран в общем случае предназначена опция -print. Вывод этот имеет примерно следующий вид:
Сходный смысл имеет и опция -ls, однако она выводит более полные сведения о найденных файлах, аналогично команде ls с опциями -dgils:
Важное, как мне кажется, замечание. Если команда указанного вида будет дана от лица обычного пользователя (не root-оператора), кроме приведенной выше строки вывода, последуют многочисленные сообщения вроде
указывающие на каталоги, закрытые для просмотра обычным пользователем, и весьма мешающие восприятию. Чтобы подавить их, следует перенаправить вывод сообщения об ошибках в файл /dev/null, то есть указать им «Дорогу никуда»:
Идем далее. Опция -delete уничтожит все файлы, отобранные по указанным критериям. Так, командой
будут автоматически стерты все файлы, к которым не было обращения за последние 100 дней (из молчаливого предположения, что раз к ним три месяца не обращались — значит, они и вообще не нужны). Истреблению подвергнутся файлы в подкаталогах любого уровня вложенности — но не включающие их подкаталоги (если, конечно, последние сами не подпадают под критерии отбора).
И, наконец, опция -exec — именно ею обусловлено величие утилиты find. В качестве значения ее можно указать любую команду с необходимыми опциями — и она будет выполнена над отобранными файлами, которые будут рассматриваться в качестве ее аргументов. Проиллюстрируем это на примере.
Использовать опцию -delete, как мы это только что сделали — не самое здоровое решение, ибо файлы при этом удаляются без запроса, и можно случайно удалить что-нибудь нужное. И потому достигнем той же цели следующим образом:
В этом случае на удаление каждого отобранного файла будет запрашиваться подтверждение.
Обращаю внимание на последовательность символов <> ; (с пробелом между закрывающей фигурной скобкой и обратным слэшем) в конце строки. Пара фигурных скобок <> символизирует, что свои аргументы исполняемая команда (в примере — rm) получает от результатов отбора команды find, точка с запятой означает завершение строки (без нее на нажатие Enter последовало бы вторичное приглашение командной строки), а обратный слэш экранирует ее специальное значение.
Кроме опции действия -exec, у команды find есть еще одна, близкая по смыслу, опция — -ok. Она также вызывает некую произвольную команду, которой в качестве аргументов передаются имена файлов, отобранные по критериям, заданным опцией (опциями) поиска. Однако перед выполнением каждой операции над каждым файлом запрашивается подтверждение.
Приведенный пример, хотя и вполне жизненный, достаточно элементарен. Рассмотрим более сложный случай — собирание в один каталог всех скриншотов в формате PNG, разбросанных по древу домашнего каталога:
В результате все png-файлы будут изысканы и скопированы (или — перемещены, если воспользоваться командой mv вместо cp) в одно место.
А теперь — вариант решения задачи, которая казалась мне сначала трудно разрешимой: рекурсивное присвоение необходимых атрибутов доступа в разветвленном дереве каталогов — различных для регулярных файлов и каталогов.
Зачем и отчего это нужно? Поясню на примере. Как-то раз, обзаведясь огромным (40 Гбайт) винчестером, я решил собрать на него все нужные мне данные, рассеянные по дискам CD-R/RW (суммарным объемом с полкубометра) и нескольким сменным винчестерам, одни из которых были отформатированы в FAT16, другие — в FAT32, третьи — вообще в ext2fs (к слову сказать, рабочей моей системой в тот момент была FreeBSD). Сгрузив все это богачество в один каталог на новом диске, я создал в нем весьма неприглядную картину.
Ну, во-первых, все файлы, скопированные с CD и FAT-дисков, получили биты исполняемости, хотя все это были файлы данных. Казалось бы, мелочь, но иногда очень мешающая; в некоторых системах это не позволяет, например, просмотреть html-файл в Midnight Commander простым нажатием Enter. Во-вторых, для некоторых каталогов, напротив, исполнение не было предусмотрено ни для кого — то есть я же сам перейти в них не мог. В третьих, каталоги (и файлы) с CD часто не имели атрибута изменения — а они нужны мне были для работы (в т.ч. и редактирования). Кончено, от всех этих артефактов можно было бы избавиться, предусмотрев должные опции монтирования накопителей (каждого накопителя — а их число, повторяю, измерялось уже объемом занимаемого пространства), да я об этом и не подумал — что выросло, то выросло. Так что ситуация явно требовала исправления, однако проделать вручную такую работу над данными более чем в 20 Гбайт видилось немыслимым.
Да так оно, собственно, и было бы, если б не опция -exec утилиты find. Каковая позволила изменить права доступа требуемым образом. Итак, сначала отбираем все регулярные файлы и снимаем с них бит исполнения для всех, заодно присваивая атрибут изменения для себя, любимого:
Далее — поиск каталогов и обратная процедура над итоговой выборкой:
И дело — в шляпе, все права доступа стали единообразными (и теми, что мне нужны). Именно после этого случая я, подобно митьковскому Максиму, проникся величием философии марксизма (пардон, утилиты find). А ведь это еще не предел ее возможностей — последний устанавливается только встающими задачами и собственной фантазией.
Так, с помощью команды find легко наладить периодическое архивирование результатов текущей работы. Для этого перво-наперво создаем командой tar полный архив результатов своей жизнедеятельности:
А затем в меру своей испорченности (или, напротив, аккуратности), время от времени запускаем команду
Еще один практически полезный вариант использования команды find в мирных целях — периодическое добавление отдельно написанных фрагментов к итоговому труду жизни (например, мемуарам эникейщика). Впрочем, чтобы сделать это, необходимо сначала ознакомиться с командами обработки файлов, к которым мы вскоре обратимся.
А пока — об ограничении возможностей столь замечательной сцепки команды find с опцией действия -exec (распространяющиеся и на опцию -ok). Оно достаточно очевидно: вызываемая любой из этих опций команда выполняется в рамках самостоятельного процесса, что на слабых машинах, как говорят, приводит к падению производительности (должен заметить, что на машинах современных заметить этого практически невозможно).
В источниках мне встречалось указание на еще одно ограничение связки find с опцией -exec — ограничение на длину командной строки. Однако на практике с таким ограничением мне столкнуться не приходилось (даже в искусственно созданных ситуациях, типа поиска по шаблону s* и тому подобным). И в документации никаких сведений по сему поводу я не нашел.
Тем не менее, если какая-либо из этих проблем возникнет — она вполне преодолима. И сделать это призвана команда xargs. Она определяется как построитель и исполнитель командной строки со стандартного ввода. А поскольку на стандартный ввод может быть направлен вывод команды find — xargs воспримет результаты ее работы как аргументы какой-либо команды, которую в свою очередь, можно рассматривать как аргумент ее самое (по умолчанию такой командой-аргументом является /bin/echo).
Повторюсь — в реальности не вижу необходимости (для себя лично) в команде xargs и потому не занимался ее изучением. Так что заинтересованных отсылаю к соответствующей man-странице (и — библиографии в следующем абзаце).
Библиография
Прекрасное описание работы утилиты find (и xargs, заодно), правда, в BSD-реализации, — в паре статей Dru Lavigne, размещенных в Софтерре в переводах Станислава Лапшанского: часть 1 и часть 2 .
Источник