如何从文件夹中的文件名称中删除字符?

如何从文件夹中的文件名称中删除字符?

我有一个目录中的文件列表,但其中一些文件的名称中有奇怪的字符。我该如何重命名这些文件以删除这些字符?

计算机操作系统是Red Hat,字符集UTF-8。

文件列表

答案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,尽管这对于带有前导或尾随空格的文件名不起作用。

相关内容