両方のディレクトリ([A/{a,b,c}]と[n/{1,2,3}]を同時に繰り返して内容とペアを形成する方法)

両方のディレクトリ([A/{a,b,c}]と[n/{1,2,3}]を同時に繰り返して内容とペアを形成する方法)

これをどのように見つけるべきかわからないので、どこかにいる場合は答えを教えてください。また、質問のタイトルが不明で、より良い説明が思い出されない場合は、事前に謝罪したいと思います。

以下は、私がやろうとしていることの簡単な例です。異なるハードドライブに次の2つのディレクトリがあるとします。

A/data_dir1/含む:

  • dir1/
  • dir2/
  • dir3/
  • dir4/

B/info_dir1/含む:

  • dirA/
  • dirB/
  • dirC/
  • dirD/

ここでアルファベット順に並べ替えると dir1/ と dirA/ が関連付けられているので、dir1/ から一部のファイルを抽出して dirA/ にコピーしようとします。 dir2/とdirB/、dir3/、dirC/などでも同じことが起こります。

これを行うより簡単で、より良い、より正確で、より速い方法があると確信していますが、今はこのアイデアに閉じ込められており、他の方法を考えることができないので、次のことをしたいと思います。

counter1=0
for info_dir in $(ls -d info_dir1/*); do
    counter1=counter1+1
    counter2=0
    for data_dir in $(ls -d data_dir1/*); do
        counter2=counter2+1
        if [[ counter1 == counter2 ]]; then
            cp $data_dir/[file2copy] $info_dir/
        fi
    done
done

常に2つのフォルダを正しい順序で繰り返すという仮定のもと、このようにしていますが、もし問題が生じるのではないかと心配です。私が見落としている他の方法はありますか?

あなたが提供できる助けに心から感謝します!

ベストアンサー1

それぞれのディレクトリセットに対応する2つの配列を作成し、インデックスを繰り返します。

data_dirs=( A/data_dir1/*/ )
info_dirs=( B/info_dir1/*/ )
n=${#data_dirs[@]}               # assume they're the same length
for (( i = 0; i < n; i++ )); do
    left="${data_dirs[i]}"
    right="${info_dirs[i]}"
    printf "%s <-> %s\n" "$left" "$right"
    # or whatever
done

シェルはglobのファイル名をアルファベット順にソートします。dirAと対にする必要がありますdir1。背中とdirB対になりましたdir2。しかし、もう一度確認するのが最善です。その必要はありませんls。これは、シェルが提供するファイル名のリストに何も追加しない追加プロセスです。 (また、スペースを含むファイル名が破損します。)

「タプルスタイル」と「[A/an/1] [A/bn/2]」の構文が何を意味するのかわかりません。

おすすめ記事