我经常发现自己认为,“如果我在奇怪或受限的机器上需要它”,那么拥有一个尽可能可移植的通用解决方案会很好。
我一直在寻找一种仅使用 POSIX sh 和工具来或多或少有效地以相反顺序对目录中的文件列表进行排序的方法。
这应该适用于任意命名的文件,包括名称中带有控制代码字符(例如换行符)的文件。
最佳答案
所以我们的想法是按照字典顺序逆序处理一组文件。如您所知,由于文件名很奇怪,您无法解析 ls 。因为这是 POSIX,所以我们没有数组。所以这是一个可能有效的解决方案。
Glob 表达式按字典顺序返回可能的文件名列表。所以你可以做类似的事情
for file in /path/to/dir/*; do
[ -e "${file}" ] || continue
some_command "${file}"
done
如果你想反转它,你可以这样做:
set -- /path/to/dir/*
i=$#
while [ "$i" -gt 0 ]; do
eval "file=\${${i}}"; i=$((i-1));
[ -e "${file}" ] || continue
some_command "$file"
done
注意:我们必须使用evil eval
用于位置变量的评估。
更新:位置变量可能已被使用。在这种情况下,您可以执行以下操作:
j=$#
set -- /path/to/dir/* "$@"
i=$(($#-$j))
while [ "$i" -gt 0 ]; do
eval "file=\${${i}}"; i=$((i-1));
[ -e "${file}" ] || continue
some_command "$file"
done
shift "$i"
关于sorting - (快速)对 POSIX sh 中的文件列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67069192/