ルートディレクトリのサブディレクトリを繰り返しフラット化し、1レベルのサブディレクトリ構造を維持します。

ルートディレクトリのサブディレクトリを繰り返しフラット化し、1レベルのサブディレクトリ構造を維持します。

次の構造を持つ大規模なnレベルディレクトリがあります。

root
  |
   subdir1
      |
       sub_subdir1
           |
            ....(n-2 levels).....
                                 |
                                  file1
  |
   subdir2
      |
       sub_subdir2
           |
            ....(n-2 levels).....
                                 |
                                  file2

すべてのレベル1になるようにディレクトリを平坦化したいと思います。サブディレクトリ含む文書。また、レベル2を(n-1)で削除したいです。サブサブディレクトリファイルが含まれていないためです。サブディレクトリの名前はすべて異なります。

希望する結果

root
  |
   subdir1
      |
       file1
  |
   subdir2
      |
       file2

方法を説明する投稿がたくさん見つかりました。単調にするディレクトリにありますが、制御された方法でこれを行う方法については説明しません。

  • 平坦化するレベルを指定して
  • または、ルートディレクトリのすべてのサブディレクトリに対してこの操作を繰り返し実行します。

ベストアンサー1

zshを使う:

cd /root
for subdir in subdir*
do
  mv "$subdir"/**/*(.) "$subdir"
  rm -r "$subdir"/*(/)
done

これ:

  1. "/root"ディレクトリを変更します(あなたの例では)
  2. 名前付きの各サブディレクトリを繰り返しますsubdir*(例:subdir1とsubdir1の一致)。
  3. このサブディレクトリ内の一致する(予想されるがすべて一致する)ファイルをこのサブディレクトリに移動します。これはzshの**再帰的なglobing機能を使用し、glob修飾子に限定されます。*(.)つまり、このディレクトリのすべてのエントリは通常のファイルです。
  4. ファイルを移動したら、そのサブディレクトリの下にある各サブディレクトリを繰り返し削除します。これは*(/)、一致するディレクトリエントリを表すzsh glob修飾子を再利用します。

おすすめ記事