このトピックを扱うさまざまな答えを見つけました。これしかし、私の目的では動作しません。 「-」文字のせいか、設定方法のせいでしょうか?
私は端末でLinux Mint(Debian)を使用しています。
次のような多くのフォルダとサブフォルダがあります。
folder1-Misc
folder2/afolder2name-Misc
folder2/afolder2name-SomethingElse
folder3/afolder3name-Misc
folder3/afolder3name-Blahblah
folder3/afolder3name-Anotherthing
folder4/afolder4name-Misc
folder4/afolder4name-Misc/insideafolder4name-Misc
folder5/afolder5name-Misc
folder4/afolder5name-Misc/insideafolder5name-Misc
ルートフォルダから始めて、上記の内容を-Misc
含むすべてのフォルダの名前を変更したいと思います。-Docs
folder1-Docs
folder2/afolder2name-Docs
folder2/afolder2name-SomethingElse
folder3/afolder3name-Docs
folder3/afolder3name-Blahblah
folder3/afolder3name-Anotherthing
folder4/afolder4name-Docs
folder4/afolder4name-Docs/insideafolder4name-Docs
folder5/afolder5name-Docs
folder4/afolder5name-Docs/insideafolder5name-Docs
フォルダの内容(ファイル)や構造が破損する危険を冒したくありません。
上記の回答リンクはうまくいくはずですが、うまくいきません。
find . -type f -exec rename 's/*-Misc/-Docs/g' {} +
どんな助けでも大変感謝します。これが実際に簡単な解決策であることを願っています:)
答え1
別のバージョンを使用しているようですrename
。 Perlのバージョンはあなたが探しているバージョンであり、通常、そのコマンドはfile-rename
。私の場合は、パッケージをインストールする必要がありましたperl-File-Rename
。
私が見るもう一つの問題は、あなたが使っていますが、-type f
これはregular files
あなたが言ったように、ディレクトリ(およびサブディレクトリ)の名前を変更したいということです。したがって、-type d
このオプションを使用または指定せずにすべてのタイプを処理できます。
それでも自分で使うのは問題があることがわかりました-exec
。あなたが使用するときfind . -exec
:
./folder2
./folder2/afolder2name-SomethingElse
./folder2/afolder2name-Misc
./folder4
./folder4/afolder4name-Misc
./folder4/afolder4name-Misc/insideafolder4name-Misc
./folder4/afolder5name-Misc
./folder4/afolder5name-Misc/insideafolder5name-Misc
./folder1-Misc
./folder3
./folder3/afolder3name-Blahblah
./folder3/afolder3name-Anotherthing
./folder3/afolder3name-Misc
./folder5
上記の出力は、サブディレクトリの名前を変更しようとすると問題を引き起こす可能性があります。たとえば、次のようになります。
/folder4/afolder4name-Misc
./folder4/afolder4name-Misc/insideafolder4name-Misc
/folder4/afolder4name-Misc
は名前を変更しようとし/folder4/afolder4name-Docs
ましたが、次の path: に名前が変更された./folder4/afolder4name-Misc/insideafolder4name-Misc
ため、エラーが発生します。./folder4/afolder4name-Misc
./folder4/afolder4name-Docs
この問題に対する1つの考えられる解決策は、find
回復出力を使用することですtac
。したがって、コードは次のようになります。
find . | tac | xargs -L1 file-rename 's/(.*)\-Misc/$1-Docs/g'
上記のコードは動作しますが、少し遅いことがわかりました。
解決策2:より速い方法は使用することですが、mv
より多くの指示が必要です。
find . ! -path . | tac | while read -r dir; do \
[[ "${dir##*/}" =~ .*-Misc ]] && mv "$dir" "${dir%-Misc}-Docs";done