首页 > 解决方案 > 在 bash 中更改具有特殊字符的文件名

问题描述

我们正在运行一个 Ubuntu 服务器,该服务器会自动 FTP 来自客户的文件,这些文件最近显示为......'file.csv;' '文件2.csv;

我一直在尝试制定 bash 和 Python 解决方案,但没有运气。我只是想去掉单引号和分号并保留剩下的内容。这不一定是 bash,它可以是 python 甚至 perl。我在下面包含了不起作用的代码。我什至似乎无法获得目录列表。谁能指出我正确的方向?

for i in \'* 
    do
    echo $i
done

注意:更正代码以删除错误的 $echo'

标签: pythonbashperlbatch-rename

解决方案


find ... -exec rename像这样使用:

find . -name "*[;']*" -exec rename "tr/';//d" {} \;

例子:

# Create example input files:
$ touch "f'o''o'" "b;a;;r;" "b';a;'';z;'"

# Build the command by first confirming that `find` finds them all:
$ find . -name "*[;']*"                            
./f'o''o'
./b';a;'';z;'
./b;a;;r;

# Find and rename them, one by one:
$ find . -name "*[;']*" -exec rename "tr/';//d" {} \;

# Confirm that rename worked as expected:
$ ls -1rt | tail -n 3                                
foo
bar
baz

您还可以使用 进行批量重命名以提高速度xargs,例如

find ... -print0 | xargs -0 ...

但在你的情况下,我认为一个一个重命名文件已经足够快了。


命令行实用程序rename有多种形式。他们中的大多数人应该为这项任务工作。我使用了renameAristotle Pagaltzis 的 1.601 版本。要安装rename,只需下载其 Perl 脚本并将其放入$PATH. 或rename使用安装conda,如下所示:

conda install rename

推荐阅读