これをどのように見つけるべきかわからないので、どこかにいる場合は答えを教えてください。また、質問のタイトルが不明で、より良い説明が思い出されない場合は、事前に謝罪したいと思います。
以下は、私がやろうとしていることの簡単な例です。異なるハードドライブに次の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の後にソートできます。numericglobsort
dir10
dir9
dir1
dir2
/
ファイル形式の制限目次。-/
ディレクトリへのシンボリックリンクも考慮するには、に変更します。${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で繰り返します。