我在这里看到了许多使用类似以下结构的问题和答案
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)
与点文件匹配。