Поиск…
Вступление
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-блок
Размер блока:
-
c
: байты -
w
: 2 байта -
b
: 512 байт (по умолчанию) -
k
: 1 КБ -
M
: 1 МБ -
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/*'