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