Como copiar 5 arquivos mais recentes de um diretório para outro e excluir as cópias antigas

2

Como posso copiar os 5 arquivos mais recentes de um diretório para outro em um pedido "novo para antigo"?

    
por vikke 22.01.2014 / 11:09

5 respostas

2

com zsh :

cp -- *(om[1,5]) /dest/dir

Ou:

cp -- *(.om[1,5]) /dest/dir

Para limitar apenas a arquivos regulares.

Com bash ou ksh93 e GNU ls :

eval "sorted_files=($(ls -t --quoting-style=shell-always))"
cp -- "${sorted_files[@]:0:5}" /dest/dir

(observe que aqueles ignoram arquivos ocultos. Adicione o D globbing qualifier ou a opção -A a ls para incluí-los).

Para excluir os 5 mais antigos, o mesmo na ordem inversa:

rm -- *(.Om[1,5])

(observe o O em vez de o ). Ou:

eval "sorted_files=($(ls -rt --quoting-style=shell-always))"
rm -- "${sorted_files[@]:0:5}"

(observe o -r )

    
por 22.01.2014 / 11:28
1

Supondo que nomes de arquivos não contenham caracteres de nova linha:

IFS='
'
set -f
for i in 'ls -t /path/to/sourcedirectory | head -n 5'
do
  cp "/path/to/sourcedirectory/$i" /path/to/destdirectory/
done
    
por 22.01.2014 / 11:17
1

Supondo que os nomes dos arquivos não contêm novas linhas:

ls -t | head -n5 | while IFS= read -r fname
do
    cp -- "$fname" newdir/
done

Se, além disso, você quiser excluir as cópias antigas, use mv no lugar de cp :

ls -t | head -n5 | while IFS= read -r fname
do
    mv -- "$fname" newdir/
done
    
por 22.01.2014 / 11:21
1

Bem, a partir das respostas acima, supondo que a condição semelhante incorpore nomes de arquivos não contenham novas linhas neles:

ls -t | head -n5 | xargs -I{} mv {} $destination_dir

Isso faria.

    
por 22.01.2014 / 12:10
1

Remova todos os arquivos, exceto os 5 mais novos:

find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -5 | xargs rm

Você pode facilmente adaptá-lo para copiar / mover arquivos posteriormente em outro lugar.

Fonte: link

    
por 22.01.2014 / 12:16