子文件夹中的 Cat 文件(按列表给出的顺序)

Mad*_*ens 4 bash shell-script

我有一个文件夹 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)

但它不起作用。

Kus*_*nda 7

您在列表中有顺序,因此不要将文件名与文件名通配符模式匹配。相反,从列表中读取的字符串构造名称:

#!/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)

  • @MadzaYasodaraFariasVirgens 在这个问题中,_do_ 都与实际的“.pest”文件同名。如果他们不这样做,那么他们可能会遵循一些其他易于处理的模式。如果没有,您可能想就此提出一个单独的问题,但我怀疑这太难了。 (2认同)

Wil*_*ard 6

回答后续的微妙不同的问题:

我仍然想知道如果我的子目录的名称与列表中的名称不同会怎样....

让我们做一些假设:

  • 的所有子目录x都是公平游戏。
  • 所有.pest文件都是公平的游戏。
  • 如果你有两个.pest同名的文件(但在不同的目录中),你不需要关心这两个文件的排列顺序cat。

然后你有:

while read -r name; do
    cat x/*/"$name.pest"
done <y/list >concatenated.pest
Run Code Online (Sandbox Code Playgroud)

添加健全性检查有点棘手,但仍然可行。(我没有做那部分,因为我不知道我的假设是否与您的用例相符。)