Назад | Перейти на главную страницу

Linux find: как исключить каталог «.snapshot» из результатов поиска?

Я написал сценарий rsync, который использует find команда, чтобы найти все файлы старше 10 минут и скопировать их на удаленный сервер.

Соответствующая часть кода:

print_log "------ Starting $0 -------"
find $filedir -name \*.gz -mmin +10 >> $varfile
for line in $(awk -F"/" '{print $4}' $varfile); do
  rsync -raPv --ignore-existing --remove-source-files --chmod=u+rwx $filedir/$line rsync://appuser@10.11.X.X/hpfiles/ --password-file /etc/rsync.passwd  
done

Проблема, с которой я столкнулся, связана с командой find, при запуске скрипта я получаю следующий ответ, пока он зависает и не будет продолжать:

[appadmin@srv01 ~]$ /nfs/hadooper/rsync_hpfiles-lock.sh >> /var/log/rsync_hpfiles.log
find: File system loop detected; `/mass1/hpfiles_staging/.snapshot' is part of the same file system loop as `/mass1/hpfiles_staging'.
find: File system loop detected; `/mass1/hpfiles_staging/.snapshot' is part of the same file system loop as `/mass1/hpfiles_staging'.
^C^Z

Я пробовал следующее, но безрезультатно:

find $filedir -name \*.gz -a ! -name ".snapshot" -mmin +10 >> $varfile
find $filedir -name \*.gz -a ! -type d -name ".snapshot" -mmin +10 >> $varfile
find $filedir -name -a ! -path "*/.snapshot/*" \*.gz -mmin +10 >> $varfile

Как должна выглядеть моя команда, чтобы можно было исключить .snapshot каталог из вывода команды find?

find $filedir -name .snapshot -prune -o -name \*.gz -mmin +10 -print должен это сделать.

Обрезка имени .snapshot работает, но я предпочитаю обрезать путь /.snapshot:

find $filedir -path "/.snapshots" -prune -o -name \*.gz -mmin +10 -print >> $varfile