Qual é a diferença entre resultados e efetividade após adicionar -f em rm e -print em find?

4

Eu tenho uma tarefa para excluir todos os arquivos com mais de 90 dias de /dir/prd/log recrusively, ou seja, excluir de subdiretórios também. Eu fiz este comando:

find /dir/prd/log* -mtime +90 | xargs rm

Então eu estava conversando com um cara do unix e ele sugeriu

find /dir/prd/log* -mtime +90 -print | xargs rm -f

Eu só quero saber qual teria sido seu propósito colocar "-print" e "-f" no comando.

    
por Rishi Prakash 20.04.2017 / 14:45

1 resposta

15

-f diz rm para nunca solicitar ( por exemplo. quando encontra arquivos somente leitura) e ignorar arquivos ausentes é solicitado a excluir (em vez de indicar um erro). Ele também não reclamará se não tiver passado nenhum arquivo para remover.

Aqui, dependendo da% de xargs implementation rm , o stdin será o canal de find ou /dev/null , então sem -f , find pode acabar lendo a resposta para os prompts do saída de find !

-print é a ação padrão para find nas distribuições Linux e sistemas compatíveis com POSIX , mas pode precisar ser explicitamente especificado em sistemas Unix ou Unix-like muito antigos .

Assim, seu objetivo era provavelmente tornar o comando mais robusto e portátil. Você poderia fazer melhor com algumas variantes de find (indo além do POSIX):

find /dir/prd/log -mtime +90 -print0 | xargs -0 rm -f

evita problemas com nomes de arquivos contendo caracteres "especiais" (incluindo espaço, nova linha, tabulação, aspas simples, aspas duplas, barra invertida) e, se o seu find suportar a ação -delete ,

find /dir/prd/log -mtime +90 -delete

evita gerar outros processos para executar a exclusão (e também evita alguns problemas de condição de corrida). (Observe que estou especificando /dir/prd/log aqui para corresponder ao requisito declarado da primeira frase da sua pergunta, conforme confirmado nos comentários.)

Com POSIX find , você ainda pode evitar xargs e análise de nome de arquivo pedindo find para executar rm próprio:

find /dir/prd/log -mtime +90 -exec rm -f '{}' +

Além de ser mais portátil e confiável, também evita o problema de rm de leitura de respostas de find da saída mencionada acima (também evita executar rm se nenhum arquivo for encontrado).

Se /dir/prod/log contiver subdiretórios, você deverá filtrá-los para evitar mensagens de erro, pois rm não pode excluí-los:

find /dir/prd/log ! -type d -mtime +90 -exec rm -f '{}' +
    
por 20.04.2017 / 14:51