Como cp ou rm arquivos baseados em propriedade / permissão

2

Depois de um problema com spam, parei postfix

postfix stop

e verifique manualmente o mailq para encontrar centenas de milhares de spam não enviado.

O spam foi enviado de um dos sites hospedados localmente, e eu sei que o usuário não tentou enviar nenhum e-mail desde que parei de enviar e-mails.

Portanto, todas as mensagens em /var/spool/postfix/maildrop originadas daquele usuário em minha máquina são conhecidas como spam e gostaria de excluí-las ou movê-las para outro diretório para investigação posterior.

Gostaria de mover todos os arquivos com um determinado proprietário (neste caso, o usuário 'web2') de

/var/spool/postfix/maildrop

para

/var/spool/postfix/temp-spam

Como posso fazer isso?

    
por hazymat 05.02.2013 / 10:48

3 respostas

2

Você pode usar find e xargs , por exemplo:

find /var/spool/postfix/maildrop -user web2 -print0 -type f | xargs -0 -I{} mv {} /var/spool/postfix/temp-spam

Você pode testá-lo inserindo echo :

find /var/spool/postfix/maildrop -user web2 -print0 -type f | xargs -0 -I{} echo mv {} /var/spool/postfix/temp-spam
    
por 05.02.2013 / 10:58
2

você também pode fazer isso sem gerar xargs usando find ' -exec .

find /var/spool/postfix/maildrop -user THEUSER -type f -exec mv {} /var/spool/postfix/temp-spam \;

Se você quiser ver os arquivos sendo movidos, adicione um -exec adicional ao comando:

find /var/spool/postfix/maildrop -user THEUSER -type f -exec ls -lah {} \; -exec mv {} /var/spool/postfix/temp-spam \;
    
por 05.02.2013 / 22:34
0

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

    
por 06.02.2013 / 02:05