Quero copiar os últimos arquivos usados (ou talvez criados) de tamanho total para outra pasta. Isso é possível sem ferramentas adicionais?
Tenho uma unidade USB de um determinado tamanho menor que o tamanho total de uma pasta. Como não consigo copiar todos os arquivos para USB, gosto de copiar com base no uso mais recente até que não haja mais espaço. Idealmente, o método também suporta a atualização dos arquivos sem a necessidade de apagar todos os arquivos e copiá-los novamente.
Responder1
Supondo (com base na tag [linux]) que você tenha bash
disponível, bem como os comandos stat
e ; sort
supondo que você deseja sincronizar primeiro os arquivos modificados mais recentemente (consulteestatística do homempara outras opções de carimbo de data e hora), aqui está um script bash que percorrerá todos os arquivos no diretório atual ( for f in *
é a linha principal para isso), reunindo os carimbos de data e hora da última modificação em uma matriz, depois percorrerá os carimbos de data e hora classificados e impressões - uma amostra! -- comando rsync para cada arquivo (atualmente possui informações de depuração de carimbo de data/hora anexadas como prova).
Você terá que ajustar o comando rsync para sua situação específica, é claro. Este script gerará comandos rsync para cada arquivo no diretório atual; minha sugestão seria executar esses rsync "às cegas", deixando os do final falharem, ou colocá-los em um script para serem executados separadamente.
Este script não tenta otimizar a utilização do espaço do destino de forma alguma - a única ordem que ele faz é o carimbo de data e hora da última modificação (e a ordem arbitrária da matriz associativa no caso de vários arquivos modificados no mesmo segundo) .
#!/usr/bin/env bash
declare -A times
# gather the files and their last-modified timestamp into an associative array,
# indexed by filename (unique)
for f in *
do
[ -f "$f" ] && times[$f]=$(stat -c %Y "$f")
done
# get the times in (unique) sorted order
for times in ${times[@]}
do
echo $times
done | sort -run | while read t
do
# then loop through the array looking for files with that modification time
for f in "${!times[@]}"
do
if [[ ${times[$f]} = $t ]]
then
echo rsync "$f" -- timestamp ${times[$f]}
fi
done
done
Responder2
Você deve classificar seus arquivos por data de modificação e depois passar os nomes nessa ordem para rsync
cópia. Você também pode usar cp
, mas rsync
é mais eficiente.
Já existe um tópico sobre como fazer isso em superuser.com:https://superuser.com/a/208749/554082