Exclui todas as pastas que contêm arquivos que correspondem ao padrão

5

Estou tentando excluir todos os subdiretórios do meu diretório de trabalho atual que contêm um arquivo rar.

Minha primeira tentativa: find -name *.rar -exec rm -r {}/.. ';' falhou porque esse não é um diretório válido. Eu tentei usar dirname {} para um comando mais sensato, mas decidi pedir ajuda depois de quase deletar as coisas que eu não queria.

Estou usando o Cygwin no Windows 7, caso isso seja relevante.

    
por MikeFHay 30.12.2012 / 22:55

5 respostas

1

Você poderia fazer isso com um par de declarações.

Primeiro, obtenha uma lista de diretórios a serem removidos usando

find -name *.rar -exec dirname {} ';' > toremove

Em seguida, cat toremove para garantir que ele tenha as pastas desejadas. Em seguida, passe para rm -rf usando

sed 's/^/"/g' toremove | sed 's/$/"/g' | xargs rm -r

Por último, rm toremove .

    
por 31.12.2012 / 01:11
5

Com zsh:

rm -rf **/*.rar(:h)

O sufixo :h aplica o modificador de expansão do histórico h (“head” ) que remove o nome de base de cada correspondência, mantendo apenas a parte do diretório.

Certifique-se de que estes são realmente os diretórios que você deseja excluir! Por exemplo, mova-os para um diretório temporário primeiro:

mkdir DELETE
mv **/*.rar(:h) DELETE/
# check that you really want to delete everything in DELETE
rm -r DELETE
    
por 01.01.2013 / 02:12
3

Você pode usar bash -c para realizar operações mais avançadas e -exec para encontrar. O problema com o uso de um arquivo temporário e de um gato em combinação com xargs é que ele será interrompido se um arquivo contiver um espaço, uma nova linha ou uma guia. O seguinte deve funcionar:

find . -type f -name '*.rar' -exec bash -c 'rm -rf "${@%/*}"' -- {} +

Usar + para encontrar com "$ @" executará rm uma vez como com xargs .

    
por 31.12.2012 / 04:31
0

Solução de Bash 4+:

shopt -s globstar
for f in ./**/*.rar; do rm -rf "${f%/*}"; done
    
por 28.05.2013 / 22:52
-1

Você pode tentar algo assim:

for dir in */; do             # iterate all subdirectories
    touch $dir"dummy.rar"     # create a "rar"-file...
    for file in $dir*.rar; do # ...so this won't break on zero such
        rm $file              # remove the dummy, and all archives
    done
done
    
por 31.12.2012 / 04:20