如何使用“重命名”递归删除所有文件中的所有单引号?

如何使用“重命名”递归删除所有文件中的所有单引号?

标题说明了一切,是的,我知道有很多类似的问题,但我能找到的最接近的答案是删除“而不是'。到目前为止,我尝试过的是:

find -name "*'*" -type f | rename 's/\'//g'

rename 's/[']//g'和其他一些变体。我找到了所有文件,但是当我将其通过管道传输到时rename,我只是得到了>提示,并且必须Ctrl+C才能返回。我最近用这个修改了很多文件,它对任何特殊字符都有效,除了单引号。

答案1

您可以使用双引号:

rename -n "s/'//g"

测试后删除-n以真正重命名文件

不过使用-exec...

find -name "*'*" -type f -exec rename -n "s/'//g" '{}' \;

如果列表不太长,请加快速度......

find -name "*'*" -type f -exec rename -n "s/'//g" '{}' +

或者,按照评论中的建议,使用递归 shell 通配符:

shopt -s globstar
rename -n "s/'//g" **/*"'"*

您可以使用offshopt -u globstar来关闭递归通配符**,但是当您启动新的 shell 时它仍然会被关闭。

答案2

这适用bash于我的系统(OpenSUSE Leap):

$ rename "'" '' **

3 个参数rename是:"'"''**globstar),告诉它用空字符串替换引号并递归执行。

请注意,我的系统默认启用**( globstar)。我不知道如何将其关闭。

相关内容