如何在 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 创建时间。