按修改时间对文件排序

按修改时间对文件排序

我在这里看到了许多使用类似以下结构的问题和答案

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

或者

ls -t | while read i; do

现在,我知道你不应该在脚本中使用 ls因为它很容易破裂;但我找不到更好的方法来按从上次修改到最近修改的顺序操作文件(反之亦然)。

我可以使用类似的东西:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

...但这仍然会破坏名称中包含换行符的任何文件,并且启动起来更加难看。有没有更好的办法?

答案1

“不要在脚本中使用 ls”是 POSIX ls “only”的问题;对于 GNU ls 请参阅--quoting-style=.

GNU 排序解决了这个问题--zero-terminated

如果它必须兼容,那么您可以使用find ... -exec一次将一个文件名传递给执行转义的脚本。如果至少 bash 可用:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb

答案2

到目前为止,最简单的方法是使用 zsh。这全局限定符 om按时间倒序对匹配项进行排序;用于Om时间顺序。

for x in /path/to/dir/*(Nom); do …

如果目录为空,则globN限定符会导致模式扩展为空列表。使其*(DNom)与点文件匹配。

相关内容