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