1. Найти недавно измененные файлы
Допустим, мы недавно меняли какое-то количество файлов и теперь хотим их все найти. Делается это командой:
find . -name "*.php" -type f -newermt "2020-07-10 00:00:00"
Здесь: найти все файлы с расширением php, измененные после "2020-07-10 00:00:00".
Или найти файлы измененные за последние 2 дня (59 минут, 6 часов):
find . -type f -name "sess_*" -mtime +2
find . -type f -name "sess_*" -mmin +59
find . -type f -name "sess_*" -mmin +$(( 6 * 60 ))
То же, но найти файлы не содержащие "sess":
find . ! -name "*sess"
Вывести файлы с датой модификации:
find . -type f -exec stat -c "%n %y" {} \;
Если нужно исключить поиск в определенных директориях:
find . -type d \( -path ./images -o -path ./files -o -path ./sys-temp \) -prune -o -type f -newermt "2020-07-10 00:00:00"
Здесь исключаются директории ./images, ./files, ./sys-temp.
Вывести рекурсивно список файлов с полными путями и датой модификации, упорядочив по дате:
find . -name "*.php" -type f -printf "%TY-%Tm-%Td %TH:%TM %p \n" | sort -rn
2. Найти и добавить в архив
Допустим, теперь мы хотим все найденные файлы упаковать в архив:
find . -type d \( -path ./images -o -path ./files -o -path ./sys-temp \) -prune -o -type f -newermt "2020-07-10 00:00:00" -print0 | tar --exclude='./images' --exclude='./files' --exclude='./sys-temp' -zcvf ../target-archive.tgz --null -T -
Соответственно, теперь на целевой машине можно распаковать этот архив с перезаписью существующих файлов:
tar --overwrite -xzvf ./target-archive.tgz
Примечание - порядок следования ключей важен! Первым идет указание о перезаписи.
3. Найти и удалить
Найти файлы и удалить их:
find . -name "FILE-TO-FIND" -exec rm -rf {} \;
либо удалить все файлы из директории, кроме:
find /dir -type f -not -iname '*.filext' -delete
find /dir -type f -not \( -iname '*ext1' -o -iname '*ext2' \) -delete
4. Найти и скопировать
Допустим, мы хотим найти все файлы в некой директории и поддиректориях и скопировать их в другую директоию с сохранением структуры и атрбутов (меня интересовала дата модификации). Для начала надо перейти в исходную директорию поиска, чтобы отправной точкой для find можно было задать "."
. Далее ключом --parents
команды copy
мы укажем, что нужно копировать файлы включая имена директорий из вывода find
:
find . -name "*.txt" -type f -exec cp --recursive --parents --preserve \{\} /target-dir/ \;
Существующие файлы при этом перезапишутся. Чтобы они пропустить существующие файлы следует использовать ключ -n
или --no-clobber
команды copy
.