次のように、親フォルダ内にサブフォルダのリストがあります。
Parent folder
folder1
foldera
folder2
folderb
folder3
folderc
サブフォルダ名から最後の2文字を削除して、2番目のレベルのサブフォルダ名を変更したいと思います。どうすればいいですか?私は次のことを試しました
find . -depth -type d -exec sh -c 'mv "${0}" "${0%??}"' {} \;
しかし、成功しませんでした。
答え1
いいえ。次のディレクトリ構造を考慮すると、find
pureと一緒に使用できます。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 .
親ディレクトリ内のすべての子ディレクトリが変換されます。移動、削除などを行う場合、通常は予期しない結果を避けるためにディレクトリを明示的に一覧表示するのが最善です。