Поиск файлов в Linux

Несколько заготовок для поиска файлов

1. Найти недавно измененные файлы

Допустим, мы недавно меняли какое-то количество файлов и теперь хотим их все найти. Делается это командой:

find . -name "*.php" -type f -newermt "2020-07-10 00:00:00"

Здесь: найти все файлы с расширением php, измененные после "2020-07-10 00:00:00".

Если нужно исключить поиск в определенных директориях:

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.

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 -xzvf --overwrite 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.