Поиск…


Вступление

find - это команда для рекурсивного поиска каталога для файлов (или каталогов), соответствующих критериям, а затем выполнения некоторых действий над выбранными файлами.

find search_path selection_criteria action

Синтаксис

  • find [-H] [-L] [-P] [-D debugopts] [-Olevel] [путь ...] [выражение]

Поиск файла по имени или расширению

Чтобы найти файлы / каталоги с определенным именем, относительно pwd :

$ find . -name "myFile.txt"
./myFile.txt

Чтобы найти файлы / каталоги с определенным расширением, используйте подстановочный знак:

$ find . -name "*.txt"
./myFile.txt
./myFile2.txt

Чтобы найти файлы / каталоги, соответствующие одному из многих расширений, используйте флаг or :

$ find . -name "*.txt" -o -name "*.sh"

Чтобы найти файлы / каталоги, имена которых начинаются с abc и заканчиваются одним альфа-символом, следующим за одной цифрой:

$ find . -name "abc[a-z][0-9]"

Чтобы найти все файлы / каталоги, расположенные в определенном каталоге

$ find /opt

Чтобы искать только файлы (не каталоги), используйте -type f :

find /opt -type f

Чтобы искать только каталоги (не обычные файлы), используйте -type d :

find /opt -type d

Поиск файлов по типу

Чтобы найти файлы, используйте флаг -type f

$ find . -type f

Чтобы найти каталоги, используйте флаг -type d

$ find . -type d

Чтобы найти блокирующие устройства, используйте флаг -type b

$ find /dev -type b

Чтобы найти символические ссылки, используйте флаг -type l

$ find . -type l

Выполнение команд по найденному файлу

Иногда нам нужно запускать команды против большого количества файлов. Это можно сделать с помощью xargs .

find . -type d -print | xargs -r chmod 770

Вышеуказанная команда будет рекурсивно находить все каталоги ( -type d ) относительно . (который является вашим текущим рабочим каталогом) и выполнить chmod 770 на них. Параметр -r указывает на xargs чтобы не запускать chmod если find не нашел файлов.

Если ваши имена файлов или каталоги имеют в них пробельный символ, эта команда может задохнуться; решение заключается в использовании следующих

find . -type d -print0 | xargs -r -0 chmod 770

В приведенном выше примере флаги -print0 и -0 указывают, что имена файлов будут разделены с использованием null байта и позволят использовать специальные символы, например пробелы, в именах файлов. Это расширение GNU и может не работать в других версиях find и xargs .


Предпочтительный способ сделать это - пропустить команду xargs и позволить find вызов самого подпроцесса:

find . -type d -exec chmod 770 {} \;

Здесь {} является заполнителем, указывающим, что вы хотите использовать имя файла в этой точке. find будет выполнять chmod для каждого файла отдельно.

Вы также можете передавать все имена файлов на один вызов chmod , используя

find . -type d -exec chmod 770 {} +

Это также поведение приведенных выше фрагментов xargs . (Для вызова каждого файла по отдельности вы можете использовать xargs -n1 ).


Третий вариант - позволить bash loop над списком имен файлов find выходы:

find . -type d | while read -r d; do chmod 770 "$d"; done

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

find . -type f | while read -r d; do mv "$d" "${d// /_}"; done

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

Проблема с вышесказанным заключается в том, что в while read -r ожидает одну запись в строке, но имена файлов могут содержать символы новой строки (а также read -r будет потерять любое конечное пустое пространство). Вы можете исправить это, повернув все вокруг:

find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +

Таким образом, -exec получает имена файлов в форме, которая полностью корректна и переносима; bash -c принимает их как число аргументов, которые будут найдены в $@ , правильно цитируются и т. д. (сценарий должен обрабатывать эти имена правильно, конечно, каждая переменная, которая содержит имя файла, должна быть в двойном цитаты.)

Таинственный _ необходим, потому что первый аргумент bash -c 'script' используется для заполнения $0 .

Поиск файла по времени доступа / модификации

В файловой системе ext каждый файл имеет сохраненное время доступа, модификации и (состояние), связанное с ним - для просмотра этой информации вы можете использовать stat myFile.txt ; используя флаги внутри find , мы можем искать файлы, которые были изменены в течение определенного временного диапазона.

Чтобы найти файлы, которые были изменены за последние 2 часа:

$ find . -mmin -120

Чтобы найти файлы, которые не были изменены за последние 2 часа:

$ find . -mmin +120

В приведенном выше примере являются поиск только по времени изменения - чтобы произвести поиск по ступа раза, или с повешенным раз, используйте или a c соответственно.

$ find . -amin -120
$ find . -cmin +120

Общий формат:

-mmin n : Файл был изменен n минут назад
-mmin -n : Файл был изменен менее чем за n минут назад
-mmin +n : Файл был изменен более чем п минут назад


Найдите файлы, которые были изменены за последние 2 дня:

find . -mtime -2

Поиск файлов, которые не были изменены за последние 2 дня

find . -mtime +2

Используйте -atime и -ctime для времени доступа и времени изменения статуса соответственно.

Общий формат:

-mtime n : Файл был изменен nx24 часов назад
-mtime -n : Файл был изменен менее nx24 часов назад
-mtime +n : Файл был изменен более nx24 часов назад

Найти файлы, измененные в диапазоне дат , с 2007-06-07 по 2007-06-08:

find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08  

Найти файлы, доступные в диапазоне временных меток (используя файлы как временную метку), от 1 часа до 10 минут назад:

touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print  

Общий формат:

-newerXY reference : сравнивает -newerXY reference метку текущего файла со ссылкой. XY может иметь одно из следующих значений: at (время доступа), mt (время модификации), ct (время изменения) и т. Д. reference - это имя файла, для которого требуется сравнить указанную временную метку (доступ, изменение, изменение) или строку, описывающую абсолютное время.

Поиск файлов по определенному расширению

Чтобы найти все файлы определенного расширения в текущем пути, вы можете использовать следующий синтаксис find . Он работает за счет использования в bash's встроенного glob конструкции , чтобы соответствовать все имена , имеющие .extension .

find /directory/to/search -maxdepth 1 -type f -name "*.extension"

Чтобы найти все файлы типа .txt из текущего каталога, выполните

find . -maxdepth 1 -type f -name "*.txt"

Поиск файлов по размеру

Найти файлы размером более 15 МБ:

find -type f -size +15M

Найдите файлы размером менее 12 КБ:

find -type f -size -12k

Поиск файлов размером от 12 КБ:

find -type f -size 12k

Или же

find -type f -size 12288c

Или же

find -type f -size 24b

Или же

find -type f -size 24

Общий формат:

find [options] -size n[cwbkMG]

Найти файлы размером n-блока, где + n означает больше n-блока, -n означает меньше n-блока и n (без знака) означает ровно n-блок

Размер блока:

  1. c : байты
  2. w : 2 байта
  3. b : 512 байт (по умолчанию)
  4. k : 1 КБ
  5. M : 1 МБ
  6. G : 1 ГБ

Фильтрация пути

Параметр -path позволяет указать шаблон, соответствующий пути результата. Шаблон может совпадать и с самим именем.

Чтобы найти только файлы, содержащие log любом месте своего пути (папка или имя):

find . -type f -path '*log*'

Чтобы найти только файлы в папке с именем log (на любом уровне):

find . -type f -path '*/log/*'

Чтобы найти только файлы в папке с именем log или data :

find . -type f -path '*/log/*' -o -path '*/data/*'

Чтобы найти все файлы, кроме тех, которые содержатся в папке bin :

find . -type f -not -path '*/bin/*'

Чтобы найти все файлы всех файлов, кроме тех, которые содержатся в папке с именем bin или log files:

find . -type f -not -path '*log' -not -path '*/bin/*'


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow