再帰Linuxファイルシステムから無効な文字を削除する

再帰Linuxファイルシステムから無効な文字を削除する

無効な文字を使用するフォルダ/ファイルでいっぱいの巨大なファイルシステムがあります。

私が望むことをほとんど実行するコマンドを見つけました。このスレッドから来たものです。https://stackoverflow.com/questions/40712263/how-to-remove-special-characters-in-file-names

問題のコマンドは次のとおりです。

for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done &

これにより、英数字以外のすべての文字、ハイフン、アンダースコア、アンダースコアの付いたピリオドが削除されます。

このコマンドでは、スペースをアンダースコアに置き換えるのではなく、無視してください。

私はこのようなバリエーションを試しました。

for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._- ]/_/g'); done & 

[]の中にスペースを追加しましたが、もちろん物事はそれほど単純ではありません。

デフォルトでは、ファイル/フォルダで英数字、ハイフン、アンダースコア、スペース、またはピリオド/ピリオドを使用しない限り、他のすべての文字をアンダースコアに置き換えたいと思います。

スペースや他の文字を無視するように上記のコマンドをどのように変更できますか?それともこれを行うより良い方法はありますか?残念ながら、このサーバーでは名前変更コマンドが機能しないため、私が見つけた他の解決策の一部が制限されます。

答え1

使用find真珠rename:

find . -depth -exec rename -n 's/[^\w .-]/_/g' {} +

-n出力に満足したら削除します。

これは再帰的、そして:

LESS='+/^ +-depth' man find

-depth各ディレクトリの内容は、ディレクトリ自体を処理する前に処理されます。

答え2

文字クラス-の表現文字範囲。書くと、「で始まり終わるすべての文字と一致.-します。これはまったく文字ではありません。.今後 .

リテラル文字と一致するために-必要

  • 脱出するには:\-
  • キャラクタークラスの最初に入れるか、
  • キャラクタークラスの最後に入れてください。

だから、

for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._ -]/_/g'); done &

あなたが欲しいものをする必要があります。

関連情報