フォルダ名の一部を新しい文字列に置き換えます。

フォルダ名の一部を新しい文字列に置き換えます。

このトピックを扱うさまざまな答えを見つけました。これしかし、私の目的では動作しません。 「-」文字のせいか、設定方法のせいでしょうか?

私は端末で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

おすすめ記事