両方のディレクトリ([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]」の構文が何を意味するのかわかりません。

答え2

ディレクトリ構造が与えられたら、必要なディレクトリ名のペアを生成するいくつかの方法は次のとおりです。

for info_dir in info_dir1/*/; do read data_dir; echo "$data_dir" "$info_dir"; done <<< $(ls -1d data_dir1/*/)
data_dir1/dir1/ info_dir1/dirA/
data_dir1/dir2/ info_dir1/dirB/
data_dir1/dir3/ info_dir1/dirC/
data_dir1/dir4/ info_dir1/dirD/

または

paste <(ls -1d data_dir1/*/) <(ls -1d info_dir1/*/)
data_dir1/dir1/ info_dir1/dirA/
data_dir1/dir2/ info_dir1/dirB/
data_dir1/dir3/ info_dir1/dirC/
data_dir1/dir4/ info_dir1/dirD/

または

{ ls -d data_dir1/*/; ls -d info_dir1/*/; } | \pr -2ts" " -
data_dir1/dir1/ info_dir1/dirA/
data_dir1/dir2/ info_dir1/dirB/
data_dir1/dir3/ info_dir1/dirC/
data_dir1/dir4/ info_dir1/dirD/

答え3

存在するzsh

data_dirs=( A/data_dir1/*(Nn/) )
info_dirs=( B/info_dir1/*(Nn/) )
for data info in ${data_dirs:^info_dirs}; do
  something with $data and $info
done

どこ:

  • たとえば、glob修飾子はn通常、語彙ソートされたglobで実行されているように、andの間ではなくandの後にソートできます。numericglobsortdir10dir9dir1dir2
  • /ファイル形式の制限目次-/ディレクトリへのシンボリックリンクも考慮するには、に変更します。
  • ${A:^B}2つの配列を圧縮します。サイズが異なる場合、最長サイズは最短サイズに切り捨てられます。たとえば、(a b c)zippedを使用する(1 2)(a 1 b 2)
  • ではzsh複数の変数を使用して繰り返すことができるので、for i j in a 1 b 2まずi = aj = 1で繰り返し、次にi = bj = 2で繰り返します。

関連情報