URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 97604
[ Назад ]

Исходное сообщение
"удалить старые папки по содержимому"

Отправлено Роман , 10-Июн-20 11:29 
добрый там у кого что.
подскажите как мне удалить именно папки в который файлы старше определенного периода
find /mnt/backup/ -mtime +365 -type d -maxdepth 5 -mindepth 5 не прокатил так как в папках встречаются свежие файлы

p/s
то есть мне нужно получить список папок для удаления содержимое которых старше к примеру года
подскажите способ плиз


Содержание

Сообщения в этом обсуждении
"удалить старые папки по содержимому"
Отправлено Аноним , 10-Июн-20 11:46 
если в каталоге есть и старые и новые файлы, то старые все равно надо сохранить и пропустить каталог?

"удалить старые папки по содержимому"
Отправлено Роман , 10-Июн-20 11:53 
> если в каталоге есть и старые и новые файлы, то старые все
> равно надо сохранить и пропустить каталог?

да. в том то и дело


"удалить старые папки по содержимому"
Отправлено Аноним , 10-Июн-20 12:41 
красивых вариантов не знаю, к сожалению
если обновленных каталогов ожидается не слишком много, то можно попробовать такую наркоманию
 find /mnt/backup/ -type d -maxdepth 5 -mindepth 5 | fgrep -v -f <(find /mnt/backup/ -type f -mtime -365 -maxdepth 5 -mindepth 5 -printf '%h\n' | sort -u)


"удалить старые папки по содержимому"
Отправлено Роман , 10-Июн-20 15:59 
> красивых вариантов не знаю, к сожалению
> если обновленных каталогов ожидается не слишком много, то можно попробовать такую наркоманию
>
 find /mnt/backup/ -type d -maxdepth 5 -mindepth 5 | fgrep -v 
> -f <(find /mnt/backup/ -type f -mtime -365 -maxdepth 5 -mindepth 5
> -printf '%h\n' | sort -u)

спасибо!
лучше все равно я так понял не будет )))


"удалить старые папки по содержимому"
Отправлено Аноним , 10-Июн-20 16:50 
только тут по идее не учитывается случай, когда каталог может содержать один старый файл и несколько обновляемых вложенных каталогов

"удалить старые папки по содержимому"
Отправлено Аноним , 10-Июн-20 15:55 

find . -type d -links 2 | while read DIR ; do [ -z $(find "$DIR" -type f -mtime -365) ] && echo "$DIR" ; done ;

Находит все директории без субдиректорий и печатает те, в которых файлы не менялись в последние 365 дней. Проверьте, должно работать.


"удалить старые папки по содержимому"
Отправлено Роман , 10-Июн-20 16:00 
> find . -type d -links 2 | while read DIR ; do
> [ -z $(find "$DIR" -type f -mtime -365) ] && echo
> "$DIR" ; done ;
> Находит все директории без субдиректорий и печатает те, в которых файлы не
> менялись в последние 365 дней. Проверьте, должно работать.

сейчас попробую


"удалить старые папки по содержимому"
Отправлено Аноним , 10-Июн-20 16:01 
`find . -type d -links 2 | while read DIR ; do [ -z "$(find "$DIR" -type f -mtime -365)" ] && echo "$DIR" ; done ;`

Вот окончательная работающая версия.
Посвящается всем, кому лень прочитать тоненькую книжку по шелл скриптам.


"удалить старые папки по содержимому"
Отправлено Роман , 10-Июн-20 16:03 
> find . -type d -links 2 | while read DIR ; do
> [ -z $(find "$DIR" -type f -mtime -365) ] && echo
> "$DIR" ; done ;
> Находит все директории без субдиректорий и печатает те, в которых файлы не
> менялись в последние 365 дней. Проверьте, должно работать.

а если есть субдериктории


"удалить старые папки по содержимому"
Отправлено Аноним , 10-Июн-20 17:04 
>> find . -type d -links 2 | while read DIR ; do
>> [ -z $(find "$DIR" -type f -mtime -365) ] && echo
>> "$DIR" ; done ;
>> Находит все директории без субдиректорий и печатает те, в которых файлы не
>> менялись в последние 365 дней. Проверьте, должно работать.
> а если есть субдериктории

Да это в принципе не важно, просто для исключения прохода по одним и тем же файлам по много раз, если большая вложенность.
Для нормальной работы нужно загружать в пайп только те директории, которые потенциально требуется удалить. Как этот список составить, сами думайте.


"удалить старые папки по содержимому"
Отправлено ACCA , 23-Июн-20 21:09 
Разверни задачу.

Найди каталоги, где есть новые файлы. Ты ищешь файлы, поэтому depth = 5+1:

find -mtime -365 -maxdepth 6 -mindepth 6 -type f -print0 | xargs -0 dirname -z | sort -zu

найди все каталоги. Ты ищешь каталоги, поэтому depth = 5:

find -maxdepth 5 -mindepth 5 -type d -print0 | sort -zu


Слей два списка в один и найди тех, кто упомянут только один раз:

sort -z <(find -mtime -365 -maxdepth 6 -mindepth 6 -type f -print0 | xargs -0 dirname -z | sort -zu) \
<(find -maxdepth 5 -mindepth 5 -type d -print0 | sort -zu) | uniq -zu

Для отладки посмотри на эти каталоги:

sort -z <(find -mtime -365 -maxdepth 6 -mindepth 6 -type f -print0 | xargs -0 dirname -z | sort -zu) \
<(find -maxdepth 5 -mindepth 5 -type d -print0 | sort -zu) | uniq -zu | xargs -0 -L 1 echo

И удали их нах.

sort -z <(find -mtime -365 -maxdepth 6 -mindepth 6 -type f -print0 | xargs -0 dirname -z | sort -zu) \
<(find -maxdepth 5 -mindepth 5 -type d -print0 | sort -zu) | uniq -zu | xargs -0 rm -rf


Учти, что если у тебя нет новых файлов, то будут удалены вообще все каталоги.