Como faço para obter o arquivo mais recente de uma lista de arquivos em um determinado diretório [closed]

4

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?

    
por Abbireddy 28.05.2014 / 11:50

4 respostas

17

ls -t1 |  head -n 1

O primeiro listará todos os arquivos ordenados pelo tempo de acesso, o último selecionará a primeira linha.

    
por 28.05.2014 / 12:07
4

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
    
por 28.05.2014 / 15:15
3

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 .

    
por 28.05.2014 / 14:21
3

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/
    
por 29.05.2014 / 05:12