Find – поиск и удаление файлов

Удаление файлов старше N дней

find /dir/ -atime +N | xargs rm -f

или

find /dir/ -atime +N -delete

или

find /dir/ -name "*.jpg" -mtime +N -exec rm -f {} \;

или

find /dir/ \( -name "*.jpg" -o -name "*.png" \) \! -newerct '30 days ago' -delete

Ключи:

  • -name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки.
  • -o — логическое “или”
  • -a — логическое “и”
  • -type — тип искомого: f=файл, d=каталог, l=ссылка (link).
  • -user — владелец: имя пользователя или UID.
  • -group — владелец: группа пользователя или GID.
  • -perm — указываются права доступа.
  • -size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
  • -atime — время последнего обращения к файлу.
  • -ctime — время последнего изменения владельца или прав доступа к файлу.
  • -mtime — время последнего изменения файла.
  • -newer другой_файл — искать файлы созданные позже, чем другой_файл.
  • -delete — удалять найденные файлы.
  • -ls — генерирует вывод как команда ls -dgils.
  • -print — показывает на экране найденные файлы.
  • -exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
  • -ok — перед выполнением команды указанной в -exec, выдаёт запрос.
  • -depth — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
  • -prune — используется, когда вы хотите исключить из поиска определённые каталоги.
  • N — количество дней.

Найти и удалить файлы старше N дней:

#/usr/bin/find /home/.trash/ -type f -mtime +30 -exec rm -rf {} \;
# find /path/to/files/* -mtime +1 -delete
# find /somewhere -type f -mtime +7 -print0 | xargs -0 rm -f

Предварительно проверить:

/usr/bin/find /home/.trash/ -type f -mtime +10 -print

Уточненный поиск файлов, если известно примерное время не старее 12-25 11:35 но и не старше 12-28 19:35

# find -mindepth 1 -newermt '2018-12-25 11:35' ! -newermt '2018-12-28 19:35' -print0 | xargs -0 cp -p --target-directory=/home/svm/12.28

Все файлы с расширением .doc и не старше 7 дней и скопировать в директорию

# find /home/resc/ -name \*.doc ! -mtime +7 -print0 | xargs -0 cp -p --target-directory=/home/svm/12.28-2

Файлы созданные или изменённые в течении последних 5 минут

# find /home/user -type f -mmin -5

Время последнего обращения к которым более 5 дней

# find /usr/bin -type f -atime +5

Поиск строки в файлах

# find ./ -type f -exec grep -i -H "STRING" {} \;

Найти все файлы php в который встречается строка STRING:

# find ./ -type f -name "*.php" -exec grep -i -H "STRING" {} \;

Так же можно использовать команду grep с опцией -R для поиска файлов по содержимому:

# grep "STRING" -R /path/for/find

Исключить из поиска саму директорию

# find /var/log/journal -mindepth 1 -type d
# find /var/log/journal -mindepth 1 -type d -empty -delete 2>/dev/null

Массовое изменение прав доступа

Найти рекурсивно все директории и изменить права

# chmod 755 $(find /path/to/base/dir -type d)

Найти все файлы и изменить им права

# chmod 644 $(find /path/to/base/dir -type f)

или

Установка прав доступа 644 на все файлы в текущей директории и всех поддиректориях:

# find ./ -type f -exec chmod 644 {} \;

Установка прав доступа 755 на все папки в текущей директории и всех поддиректориях:

# find ./ -type d -exec chmod 755 {} \;

Скобочки {} означают передаваемый аргумент команде выполняющейся в -exec от утилиты find, такой как путь файла

Исключить директорию:

/usr/bin/find /dir/ -type f -mtime +28 \
-not -path "/dir/dir1/*" \
-not -path "/dir/dir2/*" \
-not -path "/dir/dir3/*" \
-print

Пакетное переминование файлов:

Ищем все файлы формата txt и переминовываем в jpg

find . -type f | sed -e "p;s/txt/doc/" | xargs -n2 mv
image_pdfimage_print

Leave a Reply

Your email address will not be published. Required fields are marked *