如何在 Linux 机器上的当前目录中找到最新创建的文件?

如何在 Linux 机器上的当前目录中找到最新创建的文件?

如何在 Linux 机器上的当前目录中找到最后创建的文件?

注意:我不知道mtime。

答案1

对于文件名中包含空格的文件而言,此解决方案是安全的。字符串以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将其删除。

答案2

Linux 不存储文件诞生的时间戳,但如果自创建以来目录中没有其他文件发生更改,则可以按修改时间对文件进行排序并返回第一个文件。

ls -at | head -1

答案3

如果你使用的是 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,不确定)文件系统。

  • 它可以处理任何文件名,空格和换行符等都不是问题。

答案4

经典 Unix 文件系统不存储文件创建时间。经典文件系统上最接近的存储时间是 inode 创建时间。这不是文件在当前目录中创建的时间,而是在该文件系统中创建的时间。如果文件移动,inode 也会移动,但创建时间保持不变。如果跨文件系统“移动”,这实际上是复制 + rm,inode 会在新文件系统上创建。这可能是也可能不是您想要的。

该命令:ls -1c | head -1将找到最新的 inode 创建时间。

相关内容