ls -t1 | head -n 1
O primeiro listará todos os arquivos ordenados pelo tempo de acesso, o último selecionará a primeira linha.
Eu preciso obter o arquivo mais recente de uma lista de arquivos em um diretório específico.
Quando executo o script na primeira vez em que copiei a lista de arquivos em um diretório específico para outro diretório.
A partir da segunda execução, preciso obter os arquivos mais recentes de uma lista de arquivos no mesmo diretório para copiar esses arquivos para o outro diretório.
Aqui, na primeira execução, estou capturando a data de criação do último arquivo em uma variável, quando o script é executado uma segunda vez, arquivos maiores que a última data de criação do arquivo na primeira execução; esses arquivos precisam ser copiados para o outro diretório.
Por favor, alguém poderia me ajudar a obter os arquivos mais recentes?
ls -t1 | head -n 1
O primeiro listará todos os arquivos ordenados pelo tempo de acesso, o último selecionará a primeira linha.
Se você estiver copiando arquivos de um diretório para outro com base nos horários de modificação, considere rsync
. Uma maneira muito simples de fazer o mesmo pode ser:
rsync -t ./dir1/ ./dir2/
Ou apenas para ver o que isso faria:
rsync -t --list-only ./dir1/ ./dir2/
Como Gilles observa em um comentário abaixo, pode haver circunstâncias atenuantes que evitam o uso da opção -t
para você. Mas se você tirar qualquer coisa deste, que seja possível e deve testar os resultados que você deseja e que a opção rsync
--list-only
é muito meios simples de o fazer.
Além disso, talvez ...
man rsync
Se o seu objetivo for mover um monte de arquivos com base no tempo de modificação e a versão do seu sistema de find
suportar o tipo -newerXY
de testes, você poderá fazer algo como
find -type f -newermt "@$lasttime" -exec mv -t path/to/destination/ {} +
em que $lasttime
é o tempo de modificação do arquivo que você salvou anteriormente, em segundos desde a época (por exemplo, conforme obtido de stat -c %Y yourfile
).
Você também pode usar find -newer somefile
ou find -newermm somefile
para comparar os tempos de modificação com o de um arquivo de referência diretamente, em vez de salvar o registro de data e hora do arquivo de referência em uma variável.
Para limitar a seleção ao diretório atual (excluir subdiretórios), você pode adicionar -maxdepth 1
ao comando find
.
No zsh, o arquivo mais recente no diretório atual é
a=(*(om[1]))
latest_file=$a[1]
cp -p $latest_file /other/directory
( Qualificadores do Glob rock, mas infelizmente o resultado ainda é uma lista, mesmo se você só solicita um elemento, daí a matriz temporária a
.)
Em outros shells, se você souber que os nomes dos arquivos não podem conter novas linhas ou caracteres não imprimíveis, use ls
:
latest_file=$(ls -t | head -n 1)
cp -p "$latest_file" /other/directory
No entanto, parece que o que você realmente está pedindo é a lista de arquivos que são mais recentes que um arquivo específico. Para isso, você pode usar o -cnewer
builtin de find
para detectar arquivos cujo conteúdo ou metadados foi alterado mais recentemente do que alguns outros arquivos. Note que a maneira que eu invoco aqui, find
também coleta arquivos em subdiretórios.
find . -cnewer "$previous_latest_files" -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
O problema continua sendo detectar o arquivo mais recente anterior ... Na verdade, o que importa é a data da cópia. Então, crie um arquivo de marcador quando fizer a cópia.
find . -cnewer marker_file -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
touch marker_file
Se os arquivos permanecerem no diretório de destino, você poderá simplesmente sincronizar os dois diretórios. Observe que, se você excluir alguns arquivos antigos do diretório de destino, mas eles permanecerem no diretório de origem, eles serão copiados novamente com esse método.
rsync -a . /other/directory/
Tags files shell-script timestamps