解決策 1:
1 つの方法は sed を使用することです:
mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')
file
を置き換えます もちろん、あなたのファイル名で。これにより、文字、数字、ピリオド、アンダースコア、またはダッシュ以外のものはすべてアンダースコアに置き換えられます。保持する文字を好きなように追加または削除したり、置換文字を他の文字に変更したり、まったく変更したりできません。
解決策 2:
Linuxボックスを使用していて、ファイルはWindowsボックスで作成されたと思います。 Linux はファイル名の文字エンコーディングとして UTF-8 を使用しますが、Windows は別のものを使用します。これが問題の原因だと思います。
「convmv」を使用します。これは、ファイル名をある文字エンコーディングから別のエンコーディングに変換できるツールです。西ヨーロッパでは、通常、次のいずれかが機能します:
convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .
Debian ベースの Linux にインストールする必要がある場合は、以下を実行してインストールできます:
sudo apt-get install convmv
毎回うまくいき、元のファイル名を復元します。
出典:LeaseWebLabs
解決策 3:
壊れた USB スティックからファイル名が壊れたいくつかの日本語ファイルを復元しましたが、上記の解決策はうまくいきませんでした。
デトックス パッケージをお勧めします:
<ブロック引用>detox ユーティリティは、ファイルの名前を変更して、作業を容易にします。スペースやその他の煩わしさを取り除きます。また、8 ビット ASCII でエンコードされた Latin-1 (ISO 8859-1) 文字、UTF-8 でエンコードされた Unicode 文字、および CGI エスケープ文字を変換またはクリーンアップします。
使用例:
detox -r -v /path/to/your/files
-r Recurse into subdirectories -v Be verbose about which files are being renamed -n Can be used for a dry run (only show what would be changed)
解決策 4:
ファイルシステムをトラバースして、そのようなファイルをすべて修正したいということですか?
これが私のやり方です
find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
print("Renaming $_ to $new\n"); rename($_, $new);
}'
これにより、ASCII 以外の文字を含むすべてのファイルが検索され、それらの文字がアンダースコア (_
) に置き換えられます。 )。ただし、新しい名前のファイルが既に存在する場合は、上書きされることに注意してください。このようなケースをチェックするようにスクリプトを変更することはできますが、単純にするためにそれを入れませんでした。
解決策 5:
https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters の回答に従って、次を使用できます:
rename 's/[^\x00-\x7F]//g' *
どこで *
名前を変更するファイルに一致します。複数のディレクトリで実行したい場合は、次のようにすることができます:
find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;
-n 引数を rename
に使用できます 予行演習を行い、変更せずに何が変更されるかを確認します。