Como encontrar um arquivo criado mais recente no diretório atual na máquina linux?


5

Como localizo o último arquivo criado no diretório atual em uma máquina Linux?

Nota: Não sei as horas.

Respostas:


3

Uma solução que é segura para arquivos com espaços dentro do nome do arquivo. As strings são terminadas com 0with print0.

$ touch "file with spaces"
$ find . -maxdepth 1 -type f   -print0 | xargs -0r ls -ltr  | tail -1
-rw-rw-r-- 1 jris  jris      0 jun  3 15:35 ./file with spaces

ou talvez mais simples:

ls -ltrp | grep -v / | tail -1

-padiciona um final /aos diretórios e os grepremove.


Isso obtém o arquivo alterado mais recente. Se ele realmente precisa ser o tempo de criação, em ext4 que é armazenado, consulte unix.stackexchange.com/a/50184/8250
jris198944

4
Por que você está sugerindo xargs? As outras respostas, tubulações lsem headou tail, lidar com nomes de arquivos com espaços, e sua xargssolução não lidar com nomes de arquivos com novas linhas.
Scott

1

O Linux não armazena um registro de data e hora para o nascimento de um arquivo, mas se nenhum outro arquivo foi alterado no diretório desde a sua criação, você pode classificar os arquivos pela hora da modificação e retornar o primeiro.

ls -at | head -1

(1) Você não precisa dizer -1; lsautomaticamente entra em um arquivo por modo de linha quando a saída é redirecionada. (2) Você não precisa dizer -a, no caso do nome do arquivo começa com um período.
Scott

1
Obrigado, mudou. No entanto, esteja avisado de que -apode ser ..ou .pode ser um problema para determinados scripts.
Vortico

1
então não é ls -Aque os arquivos mostram DOT no exceção de ..e.
Pablo Saratxaga

@ Pablo, @Vortico: Bom argumento; o usuário provavelmente desejaria excluir .e ... (A novamente, uma vez que a questão diz “último criado arquivo ”, a resposta certa pode ser ls -atl | grep "^-" | head -1.)
Scott

A rigor, o tempo de criação é armazenado por certos sistemas de arquivos, mas a API do kernel não fornece uma chamada para ele.
terdon 6/06/14

1

Se você estiver em um sistema de arquivos ext, poderá usar debugfspara obter a data de criação de um inode . Portanto, você pode coletar os inodes para cada arquivo no diretório atual e classificar por hora de criação:

#!/usr/bin/env bash

## This will hold the newest timestamp
newestT=0

## Get the partition we are running on
fs=$(df  --output=source "$@"  | tail -1); 

## Iterate through the files in the directory
## given as a target
for file in "$@"/*; do 
    ## Only process files
    if [ -f "$file" ]; then 
        ## Get this file's inode
        inode=$(ls -i "$file" | awk 'NR==1{print $1}'); 
        ## Get its creation time
        crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' $fs 2>/dev/null | grep -oP 'crtime.*-- \K.*'); 
        ## Convert it to a Unix timestamp
        timestamp=$(date -d "$crtime" +%s)
        ## Is this newer than the newest?
        if [[ $timestamp -gt $newestT ]]; then
            newestT=$timestamp;
            newest="$file";
        fi
    fi
done
## Print the newest file
echo "$newest"

Salve o script acima como ~/bin/get_newest.sh, torne-o executável ( chmod 744 get_newest.sh) e execute assim:

~/bin/get_newest.sh /target/directory

NOTAS

  • Diferentemente das outras respostas, este realmente retornará o arquivo mais recente em termos de data de criação , não aquele que foi modificado mais recentemente.

  • Ele funcionará apenas em sistemas de arquivos ext4 (talvez 3, não tenho certeza).

  • Ele pode lidar com quaisquer nomes de arquivos, espaços e novas linhas, etc. não são um problema.


0

Os sistemas de arquivos Unix clássicos não armazenam o tempo de criação do arquivo. O mais próximo que você fica dos sistemas de arquivos clássicos é o tempo de criação do inode. Não é quando o arquivo é criado no diretório atual, mas quando foi criado nesse sistema de arquivos. Se ele se move, o inode é movido, mas o tempo de criação permanece o mesmo. Se você "mover" os sistemas de arquivos, isso é realmente uma cópia + rm e o inode é criado no novo sistema de arquivos. Isso pode ou não ser o que você deseja.

O comando: ls -1c | head -1encontrará o último horário de criação do inode.


2
Não! ls –cmostra o tempo de mudança do inode , que é semelhante ao tempo de modificação, mas ainda pior (ainda mais volátil). (E ver o meu outro comentário sobre ls -1.)
Scott

Na verdade, muitos sistemas de arquivos fazem armazenar o tempo de criação (ver minha resposta), mas a API do kernel não dá acesso a ele são necessários para que outras ferramentas. De qualquer forma, Scott está certo, isso está apenas mostrando o arquivo que foi modificado mais recentemente.
terdon

0
ls -ltrh 

e o último arquivo mostrado na parte inferior é o mais novo.


Não, foi o que foi modificado pela última vez.
terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.