У меня есть папка с целой кучей подкаталогов.

Мне нужно удалить все из них, КРОМЕ папок, в которых есть файл маркера, например: DONOTDELETE.txt, внутри указанных папок.

Это возможно?

Уже прошла премьера благодаря Бенуа

( find /testftp -type d ;
  find /testftp -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u | while read i
                     do
                        rm "$i/*";
                     done

но вывод:

rm: не может lstat `/testftp/* ': нет такого файла или каталога

rm: не может lstat `/testftp/logs/* ': нет такого файла или каталога

3 ответа3

2

Как фрагмент оболочки:

for i in *; do
     [ -d "$i" ] || continue # ignore non-directories
     [ -f "$i/DONOTDELETE.txt ] && continue  # ignore directories containing DONOTDELETE
     rm -rf "$i"
done
1

Как бы я это сделал (возможно, слишком сложно):

  • Найти все каталоги
  • Найти все файлы с именем DONOTDELETE.TXT и распечатать имена dir
  • Сортировка и уникальность, чтобы сохранить уникальные линии

Так:

( find . -type d ;
  find . -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u | while read i
                     do
                        rm "$i/*";
                     done

Предупреждение, если у вас есть следующее дерево:

A/foo.txt
A/b/DONOTDELETE.TXT

Затем выходные данные этого последнего сценария будут по-прежнему выводить A поскольку он не содержит файл с именем DONOTDELETE.TXT .

По-другому:

find . -type f ! -iname DONOTDELETE.txt -delete
find . -d -type d -empty -delete

которая сначала удаляет все файлы, которые не имеют этого имени, а вторая удаляет пустой каталог (-d сначала исследует поддерево).

-3
find . -type f ! -name DONOTDELETE.txt  -print0 | xargs -0 ls -l

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .