答案1
尝试排毒。来自手册页:
姓名
排毒- 清理文件名
概要
detox [-hnLrv] [-s -sequence] [-f -configfile] [--dry-run] [--special] 文件...
描述
Detox 实用程序可重命名文件,使其更易于使用。它可删除空格和其他类似的麻烦。它还可翻译或清理以 8 位 ASCII 编码的 Latin-1 (ISO 8859-1) 字符、以 UTF-8 编码的 Unicode 字符以及 CGI 转义字符。
序列
detox 由一系列可配置的过滤器(称为序列)驱动。detoxrc(5) 中详细介绍了序列,可以使用 -L 选项发现。一些默认序列的示例是 iso8859_1 和 utf_8。
上次我检查时,它在 RHEL 6 存储库中可用。我不确定 RHEL 7 是否可用。在进行实际清理之前,建议使用detox
(-n
试运行)开关运行。例如:detox -rn /somedir
。
答案2
如果您不能使用detox
,或者您想要对新文件名有更多的控制权,则可以使用标准工具。
ls
输出到终端时,会将不可打印的字符显示为?
。如果显示的名称(例如ab?cd
)是唯一的(ls ab?cd
显示单个文件),则只需在命令中使用此掩码即可mv
:
mv ab?cd ab_cd
ls -b
将不可打印的字符显示为转义序列(例如ab\001cd
),尽管您不能在另一个命令中使用显示的名称,但它确实允许您查看所有受影响的文件:
ls -b|grep '\\' ; # includes names with embedded spaces
ls -b|grep '\\[^ ]' ; # excludes names with embedded spaces
ls
将输出到文件或管道并写入文字文件名:在这种情况下,你可以使用以下命令获取不可打印的文件名列表:
ls|env LC_ALL=C grep '[^!-~]' ; # includes names with embedded spaces
ls|env LC_ALL=C grep '[^ -~]' ; # excludes names with embedded spaces
您现在可以将此输出通过管道传输到脚本来执行所需的任何重命名,如下所示:
ls|env LC_ALL=C grep '[^!-~]'|while l=`line`; do ... ; mv "$l" "$n" ; done
省略的代码用于制定$n
您需要的任何新名称。如果您没有line
,则可以使用while read l
,尽管这对于带有前导或尾随空格的文件名不起作用。