É possível mover os últimos arquivos modificados usando ls, tail e mv?

2

Eu quero mover os últimos 3 arquivos modificados de um diretório usando comandos bash. No entanto, notei que posso usar find da seguinte maneira:

find . -type f -mtime -0.5 -print -exec mv {} /home/user/Desktop \;

Mas ainda não descobri como fazer o mesmo com ls -tr | tail -n 3 . Por exemplo, isso não funciona:

ls -tr | tail -n 3 -exec mv {} /home/user/Desktop             
tail: invalid option -- 'e'

A única razão pela qual eu prefiro usar a segunda opção é para especificar um número de arquivos em vez de um tempo aproximado. É possível fazê-lo funcionar com ls e tail

Obrigado!

    
por Robert Smith 10.09.2014 / 07:30

2 respostas

3

O comando que você está procurando é xargs , já que tail não tem uma capacidade nativa para executar um programa.

O comando completo seria:

ls -tr | tail -n 3 | xargs -I{} mv {} /home/user/Desktop

Quebrando:

  • ls -tr lista arquivos classificados por data / hora de modificação ( -t ). Os mais recentes são os primeiros, por padrão; é ao contrário (últimos arquivos modificados recentemente) se você adicionar -r .
  • tail -n 3 filtra as últimas três entradas.
  • xargs -I{} mv {} /home/user/Desktop runs mv {} /home/user/Desktop para cada linha recebida de tail . Observe que o {} é substituído pela saída de tail .

Note que você pode precisar escapar das chaves na chamada para xargs .

xargs -I\{\} mv \{\} /home/user/Desktop
    
por 10.09.2014 / 07:38
1

Dependendo dos nomes nos arquivos, uma solução que dependa da saída de ls pode ser problemática. Usando o zsh, pode-se confiar nos sinalizadores globbing para fazer o trabalho:

mv *(.om[1,3]) ${somewhere}

A "mágica" está entre os dois parênteses após o * :

  • . apenas seleciona arquivos simples;
  • om ordena os resultados do glob por mtime;
  • [1,3] seleciona os três primeiros resultados

Estou ciente de que a pergunta solicita especificamente uma solução bash, portanto, estritamente falando, essa resposta não se qualifica. No entanto, estou postando para outras pessoas que podem ter tarefas semelhantes e podem usar outros shells.

    
por 24.10.2014 / 23:59

Tags