Shell脚本循环遍历文件夹中的所有文件并按数字顺序选择它们

时间:2019-07-19 10:37:25

标签: bash shell scripting

我有以下代码循环浏览文件夹的文件。文件一直命名为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。

我希望它以数字顺序而不是字典顺序显示,换句话说,我希望循环以数字顺序遍历文件。有什么办法可以做到这一点?

2 个答案:

答案 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对它们进行数字排序。