O comando padrão find
permite combinar arquivos baseados em metadados (nome, permissões, etc.) e agir sobre eles. Ele percorre um diretório recursivamente. A sintaxe básica é find
seguida pelo (s) diretório (s) a percorrer, seguida pelos critérios de correspondência, opcionalmente seguidos por um comando a ser executado (se você não especificar um comando, find
imprimirá os nomes correspondentes). p>
find /var/spool/postfix/maildrop -user web2 -exec mv -t /var/spool/postfix/temp-spam {} +
Isso executa o comando mv -t /var/spool/postfix/temp-spam …
para os arquivos correspondentes: {}
é substituído pela lista de todos os arquivos correspondentes (se a lista for muito longa, find
executará mv
quantas vezes forem necessárias) .
A opção -t
para mv
é uma extensão do GNU (Linux / Cygwin). Em sistemas que não têm, você precisa passar os nomes dos arquivos para mover primeiro e depois o destino. A ação -exec … +
permite apenas passar os nomes dos arquivos no final da linha de comando, então você precisa recorrer a outros métodos.
find /var/spool/postfix/maildrop -user web2 -exec mv {} /var/spool/postfix/temp-spam \;
(chama mv
separadamente para cada arquivo)
find /var/spool/postfix/maildrop -user web2 -exec sh -c 'mv "$@" "$0"' /var/spool/postfix/temp-spam {} +
(usa um shell intermediário para obter os argumentos na ordem desejada)
Se você estiver usando o zsh, poderá usar seus qualificadores de glob para realizar o mesmo trabalho que find
. Aqui, o sinal u
para corresponder aos arquivos de um usuário.
mv /var/spool/postfix/maildrop/*(u:web2:) /var/spool/postfix/temp-spam
(Ao contrário dos comandos find
acima, isso não recorre a subdiretórios. Não é necessário aqui, mas se você precisar, insira **/
no caminho para dizer "zero ou mais subdiretórios", por exemplo /var/spool/postfix/maildrop/**/*(u:web2:)
.)