Respostas:
Uma solução que é segura para arquivos com espaços dentro do nome do arquivo. As strings são terminadas com 0
with 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 final /
aos diretórios e os grep
remove.
xargs
? As outras respostas, tubulações ls
em head
ou tail
, lidar com nomes de arquivos com espaços, e sua xargs
solução não lidar com nomes de arquivos com novas linhas.
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
; ls
automaticamente 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.
-a
pode ser ..
ou .
pode ser um problema para determinados scripts.
ls -A
que os arquivos mostram DOT no exceção de ..
e.
.
e ..
. (A novamente, uma vez que a questão diz “último criado arquivo ”, a resposta certa pode ser ls -atl | grep "^-" | head -1
.)
Se você estiver em um sistema de arquivos ext, poderá usar debugfs
para 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
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.
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 -1
encontrará o último horário de criação do inode.
ls –c
mostra 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
.)