Bash do Linux: Movendo / Copiando arquivos / diretórios por timestamp

0

Este é o comando que estou usando:

find absolute-path -name "*" -amin -120 -exec cp -f absolute-destination {} \;

Estou tentando copiar vários diretórios de um diretório para outro, mas apenas aqueles criados nas últimas duas horas.

Meu comando não está funcionando e eu realmente não entendi por que, se não for óbvio, não sou um usuário de Linux muito experiente. Pelo que obtenho, cp parece interpretar meu destino pretendido como a origem.

Eu até tentei usar xargs e compreendo ainda menos.

Usando o Bash no Debian Squeezy e executando o comando no root.

    
por user2766567 23.03.2015 / 04:43

1 resposta

1

From what I get cp seems to interpret my intended destination as the source.

Sim, é. Isso porque a sintaxe geral do Linux / Unix é algo assim:

[some command] [some command options] [source item] [destination item]

Então olhe para o seu comando:

find absolute-path -name "*" -amin -120 -exec cp -f absolute-destination {} \;

Esse cp -f absolute-destination {} é retroativo, pois o {} representa o arquivo de origem, conforme encontrado pelo comando find , e o "destino absoluto" é exatamente o que é; um destino. Então, essa parte do comando deve ser reescrita como cp -f {} absolute-destination .

Além disso:

  • O -name "*" é redundante e supérfluo se você estiver pesquisando todos os arquivos com base no tempo; o que significa que você pode simplesmente abandonar isso.
  • Além disso, o uso de amin é um pouco confuso, pois -amin -120 significa que “o arquivo foi acessado nos últimos 120 minutos.” Se você quiser atuar no tempo de criação dos arquivos, que deve ser alterado para cmin —aka: changed n minutes ago — instead; mais detalhes na página man do find do Linux.

Então o comando final seria:

find absolute-path -cmin -120 -exec cp -f {} absolute-destination \;

Mas antes de executar o comando cp , você deve sempre fazer um "dry run" usando echo para ver exatamente o que está acontecendo assim:

find absolute-path -cmin -120 -exec echo {} \;

Lembre-se, fazer um teste de “execução a seco” de um comando como este antes de executar o comando real / final poupará dores de cabeça a longo prazo. Especialmente se você planeja executar o comando como root .

Você nunca sabe se você pode ter cometido um erro simples e inadvertido em sua lógica de comando que pode estragar de maneiras inesperadas. E apressar um comando estruturado erroneamente para “produção” sem testes pode economizar alguns minutos no início, mas pode resultar em horas - e, em alguns casos, dias - de trabalho de limpeza. Sempre é seguro quando se trabalha na linha de comando.

    
por 23.03.2015 / 05:06