再帰的なファイルとディレクトリの操作

再帰的なファイルとディレクトリの操作

ファイルを含む複数のディレクトリに対して一連の操作を繰り返し実行しようとしています。各ディレクトリ内に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

$dand で拡張される for ループの glob のため、subdirectory1/直接サブディレクトリにのみ一致します。その孫ファイル(すでに存在する場合は文句を言わないように存在)を作成し、ワイルドカードを再使用してファイルを孫ファイルに移動します。subdirectory2/*/rootmkdir-p

シェルがglobを拡張したい場合は、引用符を解除する必要があります。だからそうですが、mv "$d"*_a.tif "$d$subA"正確mv "$d*_a.tif" "$d$subA"ではありません。

おすすめ記事