按创建日期(出生)对目录中的文件进行排序

按创建日期(出生)对目录中的文件进行排序

我的文件夹中Downloads有很多文件。我需要按照以下标准排列它们:

  • 应按类型排列;
  • 同一类型的文件应按创建日期或按我将其放入Downloads文件夹的日期依次列出。

请看一下:按修改日期查找最新文件

例如:在我的Downloads目录中,我有、、*.tar.gz文件。当我进入我的目录时,我希望看到我的文件排列在一起并按我将它们添加到此目录的时间排序。我预计第五个文件是出生时间第五小的文件。*.pdf*.zipDownloads*.tar.gz*.tar.gz

答案1

我之前的回答是以这个错误的陈述开头的:

Linux 不存储文件创建时间

是的——Linux 内核不提供从文件系统获取创建时间戳的 API。

但正如维基百科ext4 提供文件创建时间戳:

ext4 还增加了对创建日期时间戳的支持。但是,正如 Theodore Ts'o 指出的那样,虽然在 inode 中添加额外的创建日期字段很容易(从而从技术上实现对 ext4 中创建日期时间戳的支持),但修改或添加必要的系统调用(如 stat(),可能需要新版本)和依赖于它们的各种库(如 glibc)则更加困难。

正如 unix.stackexchange 所回答的那样

Several file systems store the file creation time, 
although there is no standard name for this field:

   - ufs2  → st_birthtime
   - zfs   → crtime
   - ext4  → crtime
   - btrfs → otime
   - jfs   → di_otime

这很棒问题/答案如何查找文件创建戳。脚本由@terdon 编写:

get_crtime() {

    for target in "${@}"; do
        inode=$(ls -di "${target}" | cut -d ' ' -f 1)
        fs=$(df  --output=source "${target}"  | tail -1)
        crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
        grep -oP 'crtime.*--\s*\K.*')
        printf "%s\t%s\n" "${target}" "${crtime}"
    done
}

将此脚本添加到您的.bashrc。

现在使用这个脚本你就可以得到你想要的。

进入要排序内容的文件夹

$ cd ~/Downloads
$ get_crtime * | sed -r 's/\s+/ /g' | cut -d" " -f1,3,4,6 | sort -k2M -k3,4n

对于tar.gz文件

$ get_crtime *.tar.gz | sed -r 's/\s+/ /g' | cut -d" " -f1,3,4,6 | sort -k2M -k3,4n

来源

相关内容