ディレクトリ構造の最後の2つのサブフォルダを逆に置き換えます。

ディレクトリ構造の最後の2つのサブフォルダを逆に置き換えます。

デフォルトでは、次のWindowsの質問のように、最後の2つのサブフォルダを元に戻すためにUnixメソッド(bash、Perlなど)を要求します。 https://superuser.com/questions/221/how-can-i-invert-a-directory-struct これは例であり、複数のファイルパスを変更することが目的です。

i.e. 
/dir1/dir2/dir3/dir4/myfile
to:
/dir1/dir2/dir4/dir3/myfile

答え1

4つのサブディレクトリを持つソリューションの場合は、次のように使用できます。

for p4 in */*/*/*
do
    p3="${p4%/*}" p2="${p3%/*}" d4="${p4/*\/}" d3="${p3/*\/}"
    mv "$p4" "$p3/$d3" && mv "$p3" "$p2/$d4"
done

転置を試みる前に、ターゲットディレクトリが存在するかどうかはエラーチェックされません。この場合、重複した3番目のレベルのディレクトリが作成されます。たとえばが存在し、a/b/d転置しようとするa/b/c/dと終了しますa/b/d/c/c

一致するディレクトリが多すぎる場合は、*/*/*/*各レベルで追加のループを使用してさらに分割できます。これにより、$p2パスの合計をエクスポートする必要がなくなります$p3

関連情報