2014-12-01 57 views
0

我的iomega NAS使用类似linux的操作系统,它上面有一堆备份文件,文件名包含双引号。就像这样:如何重命名一堆文件以消除引号

“水” -4

“水” -5

等。(不要问他们是如何到达那里,他们最初是在Mac上创建)

这当我尝试将文件复制到备份驱动器时导致问题:引号显然会导致副本失败。 (内置的复制工具使用rsync,但是一个相当老的版本。)

是否有终端命令批量重命名这些文件,只删除引号?如果没有,有没有一个命令来重新命名它们一次?引号似乎真的被搞乱的东西了(我知道:用户已经被警告!)

+0

我应该注意到一些文件名还包含空格(在引号内的部分之外)。例如:“水”-10 2 – user3238181 2014-12-01 16:33:37

回答

1

简单的单行bash代码:

for f in *; do mv -i "$f" "${f//[\"[:space:]]}"; done 

$f是您当前的文件名和${f//[\"[:space:]]}是你的bash子替代品,其表示:
在这f(文件名),//(替换)这些[\"[:space:]](字符)没有任何[1]。

注1:字符串替换声明:${string//substring/replacement};因为您不需要将您的子字符串替换为空,请将/replacement留空。

注2:[\"[:space:]]expr正则表达式。

+0

工作很好,谢谢!有没有办法在子目录中递归执行此操作?而不是删除一个字符(或字符串),它可以被字符(或字符串)替代? – user3238181 2014-12-01 18:43:58

+0

您可以在for循环中使用'find'命令:'for $ in $(find。-iname“*”);'。替换,我提到了注1中的bash字符串替换语法,例如:'“$ {f // [\”[:space:]/_}“'将替换所有双引号和空格以加下划线。 – 01e 2014-12-01 19:06:16

+0

问题:aren在你的第一行代码中你没有在[:space:]之后丢失一个正确的方括号吗?它似乎按照你的方式工作,但它似乎与你的解释不一致 – user3238181 2014-12-02 07:18:30

0

可以循环上的文件和使用mv

for i in * 
do 
    mv "$i" "`echo $i | sed 's/"//'`" 
done