Como fragmento de shell:
for i in *; do
[ -d "$i" ] || continue # ignore non-directories
[ -f "$i/DONOTDELETE.txt ] && continue # ignore directories containing DONOTDELETE
rm -rf "$i"
done
Eu tenho uma pasta com vários subdiretórios.
Eu preciso excluir todos eles, EXCETO as pastas que têm um arquivo de marcador, por exemplo, exemplo: DONOTDELETE.txt dentro das pastas mencionadas.
Isso é possível?
Já teve uma presolução Graças ao Benoit
( find /testftp -type d ;
find /testftp -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u | while read i
do
rm "$i/*";
done
mas a saída é:
rm: cannot lstat '/ testftp / *': Nenhum arquivo ou diretório desse tipo
rm: cannot lstat '/ testftp / logs / *': Nenhum arquivo ou diretório desse tipo
Como fragmento de shell:
for i in *; do
[ -d "$i" ] || continue # ignore non-directories
[ -f "$i/DONOTDELETE.txt ] && continue # ignore directories containing DONOTDELETE
rm -rf "$i"
done
Como eu faria isso (talvez supercomplicado):
Então:
( find . -type d ;
find . -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u | while read i
do
rm "$i/*";
done
Atenção, se você tiver a seguinte árvore:
A/foo.txt
A/b/DONOTDELETE.TXT
Em seguida, a saída deste último script ainda produzirá A
porque não contém um arquivo chamado DONOTDELETE.TXT
.
Outra maneira:
find . -type f ! -iname DONOTDELETE.txt -delete
find . -d -type d -empty -delete
que primeiro explora todos os arquivos que não têm esse nome e o segundo remove o diretório vazio ( -d
explora as subárvores primeiro).
find . -type f ! -name DONOTDELETE.txt -print0 | xargs -0 ls -l