获取按mtime排序的文件名

时间:2019-02-10 15:05:33

标签: linux bash awk find

如何获取按修改时间戳降序排列的文件名?

我应该补充一点,文件名除\0之外还可能包含任何特殊字符。

这是我到目前为止所得到的。获取文件名及其mtime的循环,但是未排序:

while IFS= read -r -d '' fname; do
  read -r -d '' mtime
done < <(find . -maxdepth 3 -printf '%p\0%T@\0')

4 个答案:

答案 0 :(得分:0)

对于同一文件夹中的文件,它将执行以下操作:

$ ls -t

如果您想越过一棵树,将根据您的Linux变体(stat命令具有不同的语法)执行以下操作之一:

$查找。 -类型f -exec stat -c'%Y%n'{} \; |排序-nr |切-d''-f2-

或者:

$查找。 -类型f -exec stat -f'%m%N'{} \; |排序-nr |切-d''-f2-

我希望这会有所帮助。

答案 1 :(得分:0)

假设您需要文件和时间戳的列表,按时间戳排序:

while IFS=: read mtime fname ; do
  echo "mtime = [$mtime] / fname = [$fname]"
done < <(find . -printf '%T@:%f\n' | sort -t:)

我选择了:作为分隔符,因为它很少用作文件名字符,甚至在DOS / NTFS中甚至被禁止使用

需要如此严格(文件名以:\n作为可能的字符), 要获得所需的东西,可以尝试:

while IFS= read -r -d '' mtime; do 
   read -r -d '' fname; 
   echo "[$mtime][$fname]"; 
done < <(find . -maxdepth 3 -printf '%T@\0%p\0' ) | sort -nr

尝试解决文件名中嵌入的换行符:

while IFS= read -r -d '' mtime; do
     read -r -d '' fname;
     printf "[%s][%s]\0" "$mtime" "$fname"; 
done < <(find . -maxdepth 3 -printf '%T@\0%p\0' ) \
| sort -nrz | tr \\0 \\n

答案 2 :(得分:0)

如果您对找到的printf进行重新排序,则可以进行排序:

find . -maxdepth 3 -printf '%T@ :: %p\0'|\
sort -zrn |\
sed -z 's/^[0-9.]* :: //' |\
xargs -0 -n1 echo

sedxargs行只是剥离mtime然后对文件名进行处理的示例。

答案 3 :(得分:0)

您需要的是:

[^\r\n]

,如果您只想在此之后获取以换行符结尾的文件名,则将其通过管道传输到awk以删除时间戳记和制表符,并用换行符替换NUL:

find . -maxdepth 3 -printf '%T@\t%p\0' | sort -zn