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.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
答え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
。