特定レベルのサブフォルダの名前変更

特定レベルのサブフォルダの名前変更

次のように、親フォルダ内にサブフォルダのリストがあります。

Parent folder
    folder1
       foldera
    folder2
       folderb
    folder3
       folderc

サブフォルダ名から最後の2文字を削除して、2番目のレベルのサブフォルダ名を変更したいと思います。どうすればいいですか?私は次のことを試しました

find . -depth -type d -exec sh -c 'mv "${0}" "${0%??}"' {} \; 

しかし、成功しませんでした。

答え1

いいえ。次のディレクトリ構造を考慮すると、findpureと一緒に使用できます。bash

./folder3
./folder3/folderc
./folder2
./folder2/folderb
./folder1
./folder1/foldera

注文する:

for f in folder*/*/; do mv -v "$f" "${f%???}"; done

後ろに:

./folder3
./folder3/folde
./folder2
./folder2/folde
./folder1
./folder1/folde

これファイル名拡張子ここではサブフォルダ内のフォルダだけが一致するfolder*/*/ため、最後にスラッシュがあります。このmvコマンドは、最後の2文字(上記の3文字)を削除します。なぜなら、末尾のスラッシュも変数値で計算されるからです。

答え2

秘密は、最小深度と最大深度パラメータを使用することです。これは私が使用するコマンドです。

`find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;`

また、私が使用したdouble ??代わりに${0$?}を使用したことに注意してください。このような問題を見つけるためにデバッグする1つの方法は、エコーを使用してタスクを追加することです。したがって、上記の例では、mvコマンドの前にechoを配置します。

$ find .
.
./folder
./folder/folder1
./folder/folder1/foldera
./folder/folder2
./folder/folder2/folderb
./folder/folder3
./folder/folder3/folderc
$ find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;
$ find .
.
./folder
./folder/folder1
./folder/folder1/folder
./folder/folder2
./folder/folder2/folder
./folder/folder3
./folder/folder3/folder

ところで、フォルダの親ディレクトリにあるので、find .or を使用できます。find folderただし、execコマンドを使用すると、find .親ディレクトリ内のすべての子ディレクトリが変換されます。移動、削除などを行う場合、通常は予期しない結果を避けるためにディレクトリを明示的に一覧表示するのが最善です。

関連情報