5

Как найти последний созданный файл в текущем каталоге на компьютере с Linux?

Примечание: я не знаю mtime.

5 ответов5

3

Решение, которое безопасно для файлов с пробелами в имени файла. Строки заканчиваются на 0 с 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

или может быть проще:

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

-p добавляет конечные / к каталогам, а затем grep удаляет их.

1

Linux не хранит временную метку для рождения файла, но если с момента его создания в каталоге не было никаких других файлов, вы можете отсортировать файлы по времени их изменения и вернуть первое.

ls -at | head -1
1

Если вы используете файловую систему ext, вы можете использовать debugfs для получения даты создания индекса. Таким образом, вы можете собрать inode для каждого файла в текущем каталоге, а затем отсортировать по времени создания:

#!/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"

Сохраните приведенный выше скрипт как ~/bin/get_newest.sh , сделайте его исполняемым (chmod 744 get_newest.sh) и запустите так:

~/bin/get_newest.sh /target/directory

ЗАМЕТКИ

  • В отличие от других ответов, этот на самом деле вернет самый новый файл с точки зрения даты его создания, а не тот, который был изменен совсем недавно.

  • Он будет работать только на файловых системах ext4 (возможно, 3, не уверен).

  • Он может иметь дело с любыми именами файлов, пробелами и символами новой строки и т.д. Не является проблемой.

0
ls -ltrh 

и последний файл, показанный внизу, самый новый.

0

Классические файловые системы Unix не хранят время создания файла. Самое близкое к классическим файловым системам - время создания инода. Это не когда файл создается в текущем каталоге, а когда он был создан в этой файловой системе. Если он перемещается, индекс перемещается, но время создания остается тем же. Если вы "перемещаетесь" по файловым системам, это действительно копия +rm, и в новой файловой системе создается индекс. Это может или не может быть то, что вы хотите.

Команда: ls -1c | head -1 найдет последнее время создания инода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .