web-dev-qa-db-ja.com

ファイル名から無効な文字を削除する方法は?

このような無効な文字を含むファイルがあります

009_-_�%86ndringshåndtering.html

それは Æファイル名のどこかに問題があります。

無効な文字をすべて削除する方法はありますか?

または、trをどうにかして使用できますか?

echo "009_-_�%86ndringshåndtering.html" | tr ???
50
Sandra

1つの方法は、sedを使用することです。

mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')

もちろん、fileをファイル名に置き換えてください。これは、文字、数字、ピリオド、アンダースコア、ダッシュ以外のものをアンダースコアに置き換えます。好きなように保持する文字を追加または削除したり、置換文字を他の文字に変更したり、何も変更しないことができます。

44

あなたは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

32
mevdschee

壊れたUSBスティックからファイル名が壊れた日本語ファイルがいくつかありましたが、上記の解決策ではうまくいきませんでした。

私はデトックスパッケージをお勧めします:

デトックスユーティリティは、ファイルの名前を変更して、操作しやすくします。スペースなどの煩わしさを取り除きます。また、8ビットASCIIでエンコードされたLatin-1(ISO 8859-1)文字、UTF-8でエンコードされたUnicode文字、およびCGIエスケープ文字も変換またはクリーンアップします。

使用例:

detox -r -v /path/to/your/files
-rサブディレクトリに再帰します。 。]
22
H. Hess

私はあなたがファイルシステムを行き来して、そのようなすべてのファイルを修正したいと思っていると思いますか?

これが私のやり方です

find /path/to/files -type f -print0 | \
Perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
  print("Renaming $_ to $new\n"); rename($_, $new);
}'

これにより、非ASCII文字を含むすべてのファイルが検索され、それらの文字がアンダースコア(_)。ただし、新しい名前のファイルが既に存在する場合は、上書きされますので注意してください。このような場合をチェックするようにスクリプトを変更できますが、簡単にするためにスクリプトを追加していません。

17
Patrick

https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters の回答に従って、以下を使用できます。

rename 's/[^\x00-\x7F]//g' *

どこ *は、名前を変更するファイルと一致します。複数のディレクトリで実行したい場合は、次のようにします。

find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;

renameの-​​n引数を使用して、予行演習を行い、変更せずに何が変更されるかを確認できます。

15
naught101

このシェルスクリプトは、ディレクトリを再帰的にサニタイズし、Linux/WindowsとFAT/NTFS/exFATの間でファイルを移植できるようにします。制御文字/:*?"<>\|COM0のようないくつかの予約済みWindows名を削除します。

sanitize() {
  shopt -s extglob;

  filename=$(basename "$1")
  directory=$(dirname "$1")

  filename_clean=$(echo "$filename" | sed -e 's/[\\/:\*\?"<>\|\x01-\x1F\x7F]//g' -e 's/^\(nul\|prn\|con\|lpt[0-9]\|com[0-9]\|aux\)\(\.\|$\)//i' -e 's/^\.*$//' -e 's/^$/NONAME/')

  if (test "$filename" != "$filename_clean")
  then
    mv -v "$1" "$directory/$filename_clean"
  fi
}

export -f sanitize

sanitize_dir() {
  find "$1" -depth -exec bash -c 'sanitize "$0"' {} \;
}

sanitize_dir '/path/to/somewhere'

Linuxは理論的にはそれほど制限されていません(/および\0はファイル名で厳密に禁止されています)が、実際には(*...などの)複数の文字がbashコマンドに干渉するため、これらも回避する必要があります。ファイル名。

ファイルの命名制限に関する優れた情報源:

5
KrisWebDev

埋め込まれた改行、マルチバイト文字、スペース、先頭のダッシュ、バックスラッシュ、スペースを処理する場合は、より堅牢なものが必要です。この回答を参照してください。
https://superuser.com/a/858671/365691

誰かが興味があれば、私はcode.google.comにスクリプトを載せます: r-n-f-bash-rename-script

1
A.Danischewski

このワンライナーを使用して、字幕ファイル内の無効な文字を削除します。

for f in *.srt; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.-]/./g;s/\.\.\././g;s/\.\././g'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done
  1. * .srtファイルのみを処理します(*はすべてのファイルを処理するために* .srtの代わりに使用できます)
  2. A〜Z〜Zの文字、0〜9の数字、ピリオド "。"、およびダッシュの "-"を除く他のすべての文字を削除します
  3. 可能な二重または三重期間を削除します
  4. ファイル名を変更する必要があるかどうかを確認します
  5. Trueの場合、mvコマンドでファイルの名前を変更し、echoコマンドで行った変更を出力します

それは映画のディレクトリ名を正規化するように働きます:

for f in */; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.]/./g' -e 's/\.\.\././g' -e 's/\.\././g' -e 's/\.*$//'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done

上記と同じ手順ですが、ディレクトリの末尾のピリオドを削除するために、sedコマンドをもう1つ追加しました

X-Men Days of Future Past(2014)[1080p]
変更:
X-Men.Days.of.Future.Past.2014.1080p

1
Brian Kuepper