ファイル名の繰り返し[閉じる]

ファイル名の繰り返し[閉じる]

複数のファイルを入力として含む関数を使用する必要があります。ファイルはファイル名で連結されます(例:dog1_animal.txt、dog2_animal.txt、dog3_animal.txt、cat1_animal.txt、cat2_animal.txt、cat3_animal.txtなど...)。私の考えは、そのファイルの名前が同様の名前で指定されていることを確認することです。パターンですが、要点はパターンを作成したくありませんが、コードはこれらのファイルの中で同じ名前のファイルを識別して関数に送信する必要があるということです。カテゴリごとに3つのファイルがあります。入れ子になったループがうまくいくと思いましたが、そうではありません。

for file in *.txt; 
do for file2 in *.txt; 
do for file3 in *.txt;
do if [[ "${file3%_*}" == "${file2%_*}" ]] && [[ "${file3%_*}" == "${file2%_*}" ]] && [[ $file1 != $file3 ]] && [[ $file3 != $file1 ]] && [[ $file3 != $file1 ]]; 
then
        :
fi; 
done;
done;
echo "${file%_*}${file2%_*}${file3%_*}"; ##my supposed comand that 
uses file file2 file 3
done

問題は、すべてのファイルを繰り返し、同じ名前のファイルを見つけて、すべてのファイルが処理されるまで関数で再利用する必要があることです。

ベストアンサー1

*.txt常に3つのグループのファイルを使用し、パターンが一致することを知っているとします。みんな関連ファイル(それはすべてです)とファイルが正しくソートされています(あなたの質問で述べたように)。

また、some_utility一度に3つのファイルグループでいくつかのユーティリティを呼び出す場合は、次のコマンドを使用できますxargs

printf '%s\0' *.txt | xargs -0 -n 3 some_utility

これにより、.dllを使用してNullで区切られたファイル名のリストが生成されますprintf。リストはに転送されxargs、一度に3つの名前を選択し、some_utilityその名前を引数として使用します。ユーティリティが終了したら、次の3つのファイル名に対して同じことを行います。

テスト(使用済みecho):

$ touch {dog,cat,mouse,horse}{1..3}_animal.txt     
$ touch {tree,flower}{1..3}_plant.txt
$ printf '%s\0' *.txt | xargs -0 -n 3 echo
cat1_animal.txt cat2_animal.txt cat3_animal.txt
dog1_animal.txt dog2_animal.txt dog3_animal.txt
flower1_plant.txt flower2_plant.txt flower3_plant.txt
horse1_animal.txt horse2_animal.txt horse3_animal.txt
mouse1_animal.txt mouse2_animal.txt mouse3_animal.txt
tree1_plant.txt tree2_plant.txt tree3_plant.txt

上記と同じファイルを使用する少し複雑な例:

$ printf '%s\0' *.txt | xargs -0 -n 3 bash -c 'printf "%s %s %s\n" "${@%_*}"' bash
cat1 cat2 cat3
dog1 dog2 dog3
flower1 flower2 flower3
horse1 horse2 horse3
mouse1 mouse2 mouse3
tree1 tree2 tree3

おすすめ記事