Exclui os arquivos especificados pela saída do find: rm acha que a lista de argumentos é muito longa.

6

Quando executo o comando a seguir, isso me dá um erro:

$ rm -f 'find /home/domain/imap/domain.com/*/Maildir -mtime +190 | grep -E '/cur/|/new/''
-bash: /bin/rm: Argument list too long

Como posso executá-lo sem o erro? (Ou como posso colocá-lo em .sh ?)

    
por Risto Salminen 20.12.2013 / 20:23

2 respostas

9

Bem, eu ficaria tentado a fazer algo assim, transformando a operação inteira em um único comando.

find /home/domain/imap/domain.com/ -mtime +190 \
     \( -ipath '*/Maildir/new/*' -o -ipath '*/Maildir/cur/*' \) \
     -delete
    
por 20.12.2013 / 20:39
3

Maneira mais simples: criar um loop, obtendo o resultado via pipe

find [expression] | while read; do [do something with $REPLY, for example] echo "$REPLY"; done

ou um arquivo temporário:

FILE="OUT_'date'"
find [expression] > $FILE
while read; do
   [do something with $REPLY, for example] echo "$REPLY"
done < $FILE

Note que se você fizer um "rm", um argumento pode parecer uma opção . Considere um arquivo que por acaso seja chamado de '-rf'. Portanto, é recomendável escrever rm -- "$FILE" ou rm "./$FILE" (ou ambos) ou então rm "$PATH/$FILE" se a exclusão não for iniciada no diretório atual. O single-liner com find não tem esse problema. Para evitar um possível aliasing para rm em um comando com opções, chame explicitamente /bin/rm .

    
por 20.12.2013 / 20:36

Tags