我有一个文件夹 x,其中包含多个子文件夹 ale、bae、galo,每个子文件夹内都有一个 .pest 文件。
x/ale/ale.pest
x/bae/bae.pest
x/galo/galo.pest
Run Code Online (Sandbox Code Playgroud)
我在文件夹 y 中有一个列表,其中包含我应该 cat .pest 文件的顺序
bae
galo
ale
Run Code Online (Sandbox Code Playgroud)
从我正在尝试的 x 文件夹中
for file in ./*/*.pest; do while read line; do cat "$line".pest; done; done <./y/list
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
您在列表中有顺序,因此不要将文件名与文件名通配符模式匹配。相反,从列表中读取的字符串构造名称:
#!/bin/sh
while read -r name; do
cat "x/$name/$name.pest"
done <y/list >concatenated.pest
Run Code Online (Sandbox Code Playgroud)
这将连接所有相关.pest文件,并concatenated.pest按照从y/list.
包括一些检查:
#!/bin/sh
while read -r name; do
pathname="x/$name/$name.pest"
if [ ! -f "$pathname" ]; then
printf 'Can not find %s\n' "$pathname"
echo 'Output file will be incomplete'
exit 1
fi >&2
cat "$pathname"
done <y/list >concatenated.pest
Run Code Online (Sandbox Code Playgroud)
回答后续的微妙不同的问题:
我仍然想知道如果我的子目录的名称与列表中的名称不同会怎样....
让我们做一些假设:
x都是公平游戏。.pest文件都是公平的游戏。.pest同名的文件(但在不同的目录中),你不需要关心这两个文件的排列顺序cat。然后你有:
while read -r name; do
cat x/*/"$name.pest"
done <y/list >concatenated.pest
Run Code Online (Sandbox Code Playgroud)
添加健全性检查有点棘手,但仍然可行。(我没有做那部分,因为我不知道我的假设是否与您的用例相符。)