Answers:
我假设您在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
Save the current file in Word 97-2004 format\sco.workflow
在Mac上(通过Microsoft Office)创建了一个名为的目录,上述编码没有任何效果。
--notest
实际重命名文件的选项。
遵循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
空运行,并查看要更改的内容,而无需更改。
我从损坏的USB记忆棒中恢复了一些日语文件,但文件名损坏,上述解决方案对我不起作用。
我推荐排毒包:
排毒实用程序会重命名文件,以使其更易于使用。它消除了空格和其他此类烦恼。它还将翻译或清除以8位ASCII编码的Latin-1(ISO 8859-1)字符,以UTF-8编码的Unicode字符以及CGI转义字符。
用法示例:
detox -r -v /path/to/your/files
-r递归到子目录 -v详细说明要重命名的文件 -n可用于空运行(仅显示要更改的内容)
detox
在本质上重新发明轮子之前先看看。如果查看手册页,由于其灵活性,它会覆盖此处所有其他建议的解决方案。
的节奏啊
,但是这些字符是有效的文件名。
此Shell脚本递归地清理目录,以使文件可在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在理论上没有那么严格的限制(/
并且\0
严格禁止在文件名中使用),但实际上,几个字符会干扰bash命令(例如*
...),因此也应避免在文件名中使用它们。
文件命名限制的重要来源:
如果要处理嵌入式换行符,多字节字符,空格,前导破折号,反斜杠和空格,则需要更强大的功能,请参见以下答案:https :
//superuser.com/a/858671/365691
如果有人感兴趣,我将脚本放在code.google.com上:rnf-bash-rename-script
我使用这种单行代码来删除字幕文件中的无效字符:
for f in *.srt; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.]/./g' |sed 's/\.\.\././g' |sed 's/\.\././g'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done
用于*中的文件;做mv“ $ file” $(回显“ $ file” | sed -e's / [^ A-Za-z0-9。- ] / / g'); 完成&