サブフォルダーの Cat ファイルは、リストで指定された順序でソートされます。

サブフォルダーの Cat ファイルは、リストで指定された順序でソートされます。

ale、bae、galo という名前のサブフォルダが多数あるフォルダ x があり、各サブフォルダに .pest ファイルがあります。

x/ale/ale.pest 
x/bae/bae.pest 
x/galo/galo.pest

.pestファイルを分類する必要がある順序で、フォルダーyにリストがあります。

bae
galo
ale

私のxフォルダで試しています。

for file in ./*/*.pest; do while read line; do cat "$line".pest; done; done  <./y/list

しかし、うまくいきません。

答え1

リストに順序があるため、ファイル名をファイル名のワイルドカードパターンと一致させないでください。代わりに、名前はリストから読み取られた文字列で構成されます。

#!/bin/sh

while read -r name; do
    cat "x/$name/$name.pest"
done <y/list >concatenated.pest

これにより、関連するすべてのファイルがリンクされ、で指定されているように、.pest現在のディレクトリにこれらのファイルから呼び出される単一のファイルが作成されます。concatenated.pesty/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

答え2

少し異なるフォローアップの質問に答えるには:

私のサブディレクトリの名前がリストの名前と同じでない場合はどうなりますか?

いくつかの仮定をしましょう:

  • すべてのサブレディットはx公正なゲームです。
  • すべての.pest文書は公正なゲームです。
  • .pest名前が同じでディレクトリが異なる2つのファイルがある場合、2つのファイルが編集される順序は気にする必要はありませんcat

それからあなたは:

while read -r name; do
    cat x/*/"$name.pest"
done <y/list >concatenated.pest

完全性チェックを追加するのは少し面倒ですが、それでも可能です。 (私の仮定があなたのユースケースに合っているかどうかわからないので、この部分は扱いません。)

答え3

複数のファイルを提供できるため、catパス名を変更してから1つのインスタンスのみを起動することをお勧めします。

sed 's|.*|x/&/&.pest|' < y/filename-list.txt | xargs -d '\n' cat

説明する:

  • sed 's|A|B|'Aのすべての項目を置き換えますB

    • ここで、Aは、.*長さや内容に関係なく、すべての文字シーケンスと一致します。

    • &B では、A と一致する全文のプレースホルダーです。

  • xargs [OPTIONS...] COMMAND [ARGS...]COMMAND [ARGS...]標準入力ストリームにトークンを追加してコマンドを実行します。

    • 通常、トークンは空白文字の数に関係なく区別されます。を使用すると、別の区切り文字(この場合は改行文字)を使用することを-d意味します。xargs\n

    • xargsインストールがそれをサポートしていない場合は、-d入力トークンにスペースが含まれていないことを確認する必要があります。 Linuxではxargs通常-d

関連情報