デフォルトでは、次の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
。