如何从文件名中删除无效的字符?

我有像这些无效字符的文件

009_-_ %86ndringshåndtering.html 

这是一个文件名出现问题的地方。

有没有办法删除所有无效的字符?

或可以用某种方式?

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

一种方法是与sed:

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

当然,用你的文件名replacefile 。 这将取代任何不是字母,数字,句点,下划线或短划线的下划线。 你可以添加或删除字符,只要你喜欢,和/或改变replace字符为其他任何东西,或根本没有。

我假设你在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

我假定你的意思是你想遍历文件系统并修复所有这些文件?

这就是我要做的方式

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

这将find所有具有非ASCII字符的文件,并用下划线( _ )replace这些字符。 请注意,如果新名称的文件已经存在,它会覆盖它。 脚本可以修改来检查这种情况,但我没有把它放在保持简单。

以下是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以进行空运行,并查看将要更改的内容,而不更改它。

这个shell脚本recursion地清理目录,使文件在Linux / Windows和FAT / NTFS / exFAT之间可移植。 它删除控制字符, /:*?"<>\|和一些保留的Windows名称,如COM0

 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在理论上限制较less(文件名中严格禁止使用\0\0 ),但实际上有几个字符会干扰bash命令(如* …),所以也应该避免使用文件名。

文件命名限制的很好的来源:

  • MSDN:命名文件
  • Wikipedia:比较文件名限制

我有一些日本文件的破损的文件名从一个坏的USB棒恢复,上述解决scheme不适合我。

我推荐排毒套餐:

解毒工具重命名文件,使他们更容易使用。 它消除了空间和其他这样的烦恼。 它还将翻译或清除以8位ASCII编码的Latin-1(ISO 8859-1)字符,以UTF-8编码的Unicode字符以及CGI转义字符。

用法示例:

 detox -r -v /path/to/your/files 
 -rrecursion到子目录中
 -v详细说明哪些文件正在重命名 
 -n可以用于空运行(只显示将被改变的内容)

如果你想处理embedded的换行符,多字节字符,空格,破折号,反斜杠和空格,你将需要更强大的function,请看这个答案:
https://superuser.com/a/858671/365691

如果有人感兴趣,我把脚本放在code.google.com上: rnf-bash-rename-script

在*文件中; 做mv“$ file”$(echo“$ file”| sed -e's / [^ A-Za-z0-9。 – ] / / g'); 完成&