すべてのサブディレクトリを現在のディレクトリに移動するにはどうすればよいですか?

すべてのサブディレクトリを現在のディレクトリに移動するにはどうすればよいですか?

私はシェル スクリプト プログラミングの初心者です。次のようなファイル階層があるとします。

/A/B/C/D
/A/B/E/F/G
/A/H/I
/A/H/J/K

/A/B/..ここでは だけでなく もあることに注意してください/A/H/...。すべての文字はディレクトリです。階層を次のように変換します。

/A/B/C
/A/B/D
/A/B/E
/A/B/F
/A/B/G
/A/H/I
/A/H/J
/A/H/K

つまり、深さが 2 より大きいすべてのディレクトリ (ディレクトリ A の深さは 0) を深さ 2 に移動します。JAVA と C を使用して実装できますが、少し遅すぎます。シェル スクリプトを使用して実装する方法を知っている人はいますか?

疑似コードは次のとおりです。

for each directory D in current directory A // A may have more than one subdirectories
    for each directory d in D
        for each object in d
            if object is a directory
                move object and all descendant subdirectories of object to /A/D;
            end if
        end for
    end for
end for

答え1

for dir in /A/*; do
    find "$dir" -mindepth 2 -depth -type d -exec mv -t "$dir" -- {} +
done

これは、少なくとも 2 レベル下 ( )にあるfindすべてのディレクトリ ( ) を深さ優先 ( ) で検索するように指示します。見つかったオブジェクトごとに が実行されます。いつものように、ソース ディレクトリを既存のターゲット ディレクトリにマージすることはできません (ただし、回避する方法はあります)。-type d-mindepth 2$dir-depthmv -t "$dir" -- <SRC>mv

関連情報