我有以下代码循环浏览文件夹的文件。文件一直命名为1.txt,2.txt到15.txt
for file in .solutions/*; do
if [ -f "$file" ]; then
echo "test case ${file##*/}:"
cat ./testcases/${file##*/}
echo
echo "result:"
cat "$file"
echo
echo
fi
done
我的问题是显示1.txt,然后显示10.txt到15.txt。
我希望它以数字顺序而不是字典顺序显示,换句话说,我希望循环以数字顺序遍历文件。有什么办法可以做到这一点?
答案 0 :(得分:1)
ls *.txt | sort -n
如果.solutions
是目录,并且没有用扩展名.txt
命名的目录,这将解决问题。
如果您想获得完整的准确性,
ls -al *.txt | awk '$0 ~ /^-/ {print $9}' | sort -n
更新:
根据您的修改, 您可以简单地做到这一点,
ls | sort -n |
while read file
do
#do whatever you want here
:
done
答案 1 :(得分:1)
通过ls
循环通常是个坏主意,因为文件名中可以包含换行符。使用过程替换而不是传递结果进行重定向将使作用域保持不变(您设置的变量将在循环后保留)。
#!/usr/bin/env bash
while IFS= read -r -d '' file; do
echo "test case ${file##*/}:"
cat ./testcases/${file##*/}
echo
echo "result:"
cat "$file"
echo
echo
done < <(find '.solutions/' -name '*.txt' -type f -print0 | sort -nz)
将IFS设置为""
可以保留前导/尾随空格,-r
可以阻止反斜杠弄乱内容,-d ''
可以使用NUL代替换行符。
find
命令看起来像普通文件-type f
,因此不需要if [ -f "$file" ]
检查。它会在-name '*.txt'
中找到'.solutions/'
个文件,并打印-print0
NUL终止。
sort
命令使用-z
选项接受NUL终止的字符串,并使用-n
对它们进行数字排序。