再帰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各ディレクトリの内容は、ディレクトリ自体を処理する前に処理されます。

おすすめ記事