【发布时间】:2020-08-28 05:26:08
【问题描述】:
我正在尝试编写一个循环,我想用它来提取所有子目录中的文本文件名并将某些字符串附加到它。此外,我希望文本文件名按^ 之后的数字排序。
例如,我有三个子目录mydir1, mydir2, mydir3。我有,
在 mydir1 中,
file223^1.txt
file221^2.txt
file666^3.txt
在 mydir2 中,
file111^1.txt
file4^2.txt
在 mydir3 中,
file1^4.txt
file5^5.txt
预期结果final.csv:
STRINGmydir1file223^1
STRINGmydir1file221^2
STRINGmydir1file666^3
STRINGmydir2file111^1
STRINGmydir2file4^2
STRINGmydir3file1^4
STRINGmydir3file5^5
这是我试过的代码:
for dir in my*/; do
array=(${dir}/*.txt)
IFS=$'\n' RGBASE=($(sort <<<"${array[@]}"));
for RG in ${RGBASE[@]}; do
RGTAG=$(basename ${RG/.txt//})
echo "STRING${dir}${RGTAG}" >> final.csv
done
done
有人可以解释一下我的代码有什么问题吗?此外,可能还有其他更好的方法可以做到这一点,但我想使用 for 循环。
这段代码的输出:
$ cat final.csv
STRINGdir1file666^3.txt
STRINGdir2file4^2.txt
STRINGdir3file5^5.txt
【问题讨论】:
-
通常使用
find和while循环更方便。填充数组 bash 有mapfile命令,与find一起使用更可靠。 -
到您的代码:以“IFS”开头的行不是您所期望的。删除
IFS=$'\n'或用mapfile -t RGBASE < <(sort <<<"${array[@]}")替换该行以打印所有行。但排序仍然不起作用。 -
要更正排序,请使用此行
RGBASE=($( printf "%s\n" "${array[@]}" | sort -t"^" -k2 ))。这告诉sort对帽子后面的数字进行排序。