如何删除文件名中的转义字符?

4

我想要从文件名中去掉转义字符,以下是一些例子:

=Web_Help_Desk_Pro%26Lite.pdf
=Windows_7_%2b_s-drev.pdf

会变成

=Web_Help_Desk_ProLite.pdf
=Windows_7__s-drev.pdf

有人知道如何使用Perl或BASH实现此功能吗?

一个简单的s/%[0-9a-f]{2}//ig不就可以做到这个吗?因为你似乎不是想解码它们,只是想去掉它们。 - derobert
我想我可以对文件内容进行操作,但我不知道如何在文件名上进行操作。 - Sandra Schlichting
1
好的,对于一堆文件来说,最简单的方法是使用Perl自带的rename脚本:在shell提示符下键入rename 's/%[0-9a-f]{2}//ig' file1 file2…。当然,您可以使用shell glob(例如,dir/*)或任何其他通常在shell中构建文件列表的方式(find | xargs等)。 - derobert
你知道提供 rename 的 Perl 包是什么吗?我所使用的 rename 来自于 util-linux-2.20.1-2.1.fc16.x86_64 - Sandra Schlichting
不确定在RedHat上是什么(它是Debian上的默认重命名),但它只是一个Perl脚本,所以你可以从Debian中获取它:http://anonscm.debian.org/gitweb/?p=perl/perl.git;a=blob;f=debian/rename;hb=HEAD - derobert
6个回答

3
如果$file是你的文件名:
my $file = '=Web_Help_Desk_Pro%26Lite.pdf';
$file =~ s/%[0-9a-f]{2}//gi;

即用空字符串替换后面跟着两个十六进制字符的%

2

仅需移除百分号和后面的两个十六进制数字:

$path =~ s/%[\da-f][\da-f]//gi;

2

这应该可以工作

sed 's/%[[:alnum:]]\{2\}//g' INPUT_FILE

alnum 匹配了 101,959 个不同的字符,而不是应该匹配的 22 个字符。 - ikegami
在 Perl 中是这样的。在 sed 中可能会少一些,但肯定比所需的 22 多。 - ikegami

2

在您的所有帮助下,我想出了

for f in $(find . -name \*.html); do
   mv $f $(echo $f | sed 's/%[a-z0-9][a-z0-9]//gi')
done

0

如果您不介意依赖关系,有一个命令 'convmv':

convmv --unescape --notest <files>

0

试试这个:

rename 's/\r//' *.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接