ファイルを含む複数のディレクトリに対して一連の操作を繰り返し実行しようとしています。各ディレクトリ内に2つのディレクトリを作成し、いくつかのファイルを各ディレクトリに移動したいと思います。
たとえば、私のディレクトリ構造は次のようになります。
root --
subdirectory1 --
file_a1_a.tif
file_a2_a.tif
file_a1_b.tif
file_a2_b.tif
subdirectory2 --
file_b1_a.tif
file_b2_a.tif
file_b1_b.tif
file_b2_b.tif
ファイルをこのように整理したいのですが…
root --
subdirectory1 --
subdirectory_a --
file_a1_a.tif
file_a2_a.tif
subdirectory_b --
file_a1_b.tif
file_a2_b.tif
subdirectory2 --
subdirectory_a --
file_b1_a.tif
file_b2_a.tif
subdirectory_b --
file_b1_b.tif
file_b2_b.tif
私は次のことをしていますが、トップレベルのディレクトリでのみ動作しているようです。
find . -type d -execdir bash -c "mkdir -p subdirectory_a && mkdir -p subdirectory_b && mv *_a.tif subdirectory_a 2>/dev/null && mv *_b.tif subdirectory_b 2>/dev/null" \;
どんな助けでも大変感謝します。
ベストアンサー1
root
子だけがあり、孫はいないので、ディレクトリから次を実行できますroot
。
subA='subdirectory_a'
subB='subdirectory_b'
for d in */; do
mkdir -p "$d$subA" "$d$subB"
mv "$d"*_a.tif "$d$subA"
mv "$d"*_b.tif "$d$subB"
done
$d
and で拡張される for ループの glob のため、subdirectory1/
直接サブディレクトリにのみ一致します。その孫ファイル(すでに存在する場合は文句を言わないように存在)を作成し、ワイルドカードを再使用してファイルを孫ファイルに移動します。subdirectory2/
*/
root
mkdir
-p
シェルがglobを拡張したい場合は、引用符を解除する必要があります。だからそうですが、mv "$d"*_a.tif "$d$subA"
正確mv "$d*_a.tif" "$d$subA"
ではありません。