我想获取当前目录中所有文件的列表(或数组),并按修改日期排序。在终端中,类似
ls -lt
的东西可以工作,但不应该在 bash 脚本中使用(http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29)...
我尝试使用
-nt
选择器(https://tips.tutorialhorizon.com/2017/11/18/nt-file-test-operator-in-bash/),但我希望有一个更简单和优雅的解决方案。
这可能对您有帮助:
在带有 GNU 扩展的 bash 中:
创建数组
mapfile -d '' a < <(find -maxdepth 1 -type f -printf "%T@ %p\0" | sort -z -k1,1g | cut -z -d ' ' -f2)
或循环文件:
while read -r -d '' _ file; do
echo "${file}"
done < <(find -maxdepth 1 -type f -printf "%T@ %p\0" | sort -z -k1,1g)
这里我们建立一个以 NULL 字符作为分隔符的文件列表。该字段本身由纪元中的修改日期组成,后跟空格和文件名。我们使用
sort
按修改日期对该列表进行排序。其输出被传递到一个 while 循环,该循环对每个零终止记录的字段进行 reads
处理。第一个字段是我们在 _
中读取的修改日期,其余部分传递给 file
。
在ZSH中:
如果你想使用其他 shell,比如 zsh,你可以这样做:
a=( *(Om) )
或
for file in *(Om); do echo "${file}"; done
这里
Om
是一个 glob 修饰符,告诉 ZSH 按修改日期对输出进行排序。