Script que exclui diretórios MAS não exclui diretórios com um arquivo .txt específico

0

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

    
por JoyIan Yee-Hernandez 23.02.2012 / 17:23

3 respostas

2

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
    
por 23.02.2012 / 20:20
1

Como eu faria isso (talvez supercomplicado):

  • Encontrar todos os dirs
  • Localize todos os arquivos denominados DONOTDELETE.TXT e imprima os nomes das pastas
  • Classifique e uniq para manter linhas exclusivas

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).

    
por 23.02.2012 / 18:05
-3
find . -type f ! -name DONOTDELETE.txt  -print0 | xargs -0 ls -l
    
por 23.02.2012 / 17:39