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

5

Como faço para encontrar o último arquivo criado no diretório atual em uma máquina Linux?

Nota: não sei o mtime.

    
por rajendra 03.06.2014 / 15:24

5 respostas

3

Uma solução que é segura para arquivos com espaços dentro do nome do arquivo. Strings são terminadas com 0 com 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

-p adiciona um / à direita aos diretórios e, em seguida, grep os remove.

    
por 03.06.2014 / 15:40
1

Se você estiver em um sistema de arquivos ext, você pode usar debugfs para obter a data de criação de um inode . Assim, você pode coletar os inodes para cada arquivo no diretório atual e, em seguida, classificar por tempo 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, na verdade, retornará o arquivo mais recente em termos de data de criação , não o que foi modificado mais recentemente.

  • Ele só funcionará em sistemas de arquivos ext4 (talvez 3, não seguros).

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

por 06.06.2014 / 11:29
0

Sistemas de arquivos clássicos Unix não armazenam tempo de criação de arquivos. O mais próximo que você obtém 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ê "move" através dos 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ê quer.

O comando: ls -1c | head -1 encontrará o tempo de criação do inode mais recente.

    
por 03.06.2014 / 16:59
0
ls -ltrh 

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

    
por 03.06.2014 / 23:42
0

O Linux não armazena um registro de data e hora para o nascimento de um arquivo, mas se nenhum outro arquivo tiver sido alterado no diretório desde sua criação, você poderá classificar os arquivos pelo tempo de modificação e retornar o primeiro.

ls -at | head -1
    
por 03.06.2014 / 15:33