Removendo arquivos que não terminam com -out

0

Como eu excluiria todos os arquivos em um diretório e seus subdiretórios que não terminam com -out? Por exemplo, apague foo.bar mas não apague foo-out.bar .

EDITAR:

Eu tentei

for a_file in $(find .  ! -name '*-out*'); do rm  $a_file; done;

Mas este script não incorpora espaços. Como eu consertaria isso?

    
por Joren 29.08.2013 / 01:23

2 respostas

2

Que tal usar a ação find do comando -delete ? que deve ser espaço em branco seguro

find . ! -name '*-out*' -type f -delete

Caso contrário, você poderia fazer um loop while de terminação nula - certifique-se de citar a variável filename assim como

while read -rd $'
find . ! -name '*-out*' -type f -delete
' f; do rm "$f"; done < <(find . ! -name '*-out*' -type f -print0)
    
por steeldriver 29.08.2013 / 02:40
0

Além da resposta.

Você não precisa usar um loop for. find fornece -exec e -delete .

Um teste rápido

cd 'mktemp -d'
touch {1..9}\ -out{a..c}
$ find . -name '*-out*'
./2 -outb
./8 -outb
./9 -outa
./4 -outc
./6 -outb
./5 -outc
./7 -outb
./9 -outb
./2 -outa
./4 -outa
./8 -outc
./8 -outa
./7 -outc
./3 -outb
./6 -outa
./3 -outa
./1 -outb
./9 -outc
./1 -outa
./5 -outa
./4 -outb
./3 -outc
./1 -outc
./5 -outb
./2 -outc
./7 -outa
./6 -outc

Funciona com espaços.

O que você precisa é:

find . ! -name '*-out*' -exec rm -f {} \;

Uma alternativa mais segura: find . -name '*-out*' -exec rm -i {} \;

OBSERVAÇÃO : use -exec rm -i {} \; para confirmar a exclusão.

    
por Terry Wang 29.08.2013 / 02:47