如何获取按修改时间戳降序排列的文件名?
我应该补充一点,文件名除\0
之外还可能包含任何特殊字符。
这是我到目前为止所得到的。获取文件名及其mtime的循环,但是未排序:
while IFS= read -r -d '' fname; do
read -r -d '' mtime
done < <(find . -maxdepth 3 -printf '%p\0%T@\0')
答案 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
sed
和xargs
行只是剥离mtime然后对文件名进行处理的示例。
答案 3 :(得分:0)
您需要的是:
[^\r\n]
,如果您只想在此之后获取以换行符结尾的文件名,则将其通过管道传输到awk以删除时间戳记和制表符,并用换行符替换NUL:
find . -maxdepth 3 -printf '%T@\t%p\0' | sort -zn