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

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

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.