替换括号之间的所有字符

时间:2012-12-01 03:26:24

标签: bash

我刚刚来自Windows 8,现在有一个很大的问题。我现在使用Ubuntu 12.10我使用FileHistory将我的数据备份到外部硬盘驱动器,现在除了在文件名中附加时间戳之外,我的所有文件都已备份。

我需要删除以“(2012_”开头,以“)结束”的括号之间的所有内容。

任何人都可以帮我吗?这是我正在尝试修复的文件列表的屏幕截图:

https://dl.dropbox.com/u/2526790/Screenshot%20from%202012-11-30%2021%3A19%3A06.png

非常感谢任何帮助。

谢谢,

3 个答案:

答案 0 :(得分:0)

一种方式:

当前文件:

$ ls -l
total 0
-rw-r--r-- 1 guru None 0 Dec  1 09:14 a (2002).iso
-rw-r--r-- 1 guru None 0 Dec  1 09:14 b_(2003_2).iso

重命名文件:

$ (
> IFS=""
> for i in *
> do
>  mv "$i" $(echo $i | sed 's/\(.*\)(.*)\(.*\)/\1\2/')
> done
> )

运行上述命令后:

$ ls -l
total 0
-rw-r--r-- 1 guru None 0 Dec  1 09:14 a .iso
-rw-r--r-- 1 guru None 0 Dec  1 09:14 b_.iso

答案 1 :(得分:0)

你可以这样做:

for FILE in *; do
    mv "$FILE" "${FILE%(*}${FILE##*)}"
done

这是有效的,因为${FILE%(*}从右边删除(*的最小匹配,即包括和在最后一个左括号之后的所有内容,而${FILE##*)}删除*)的最大匹配从左边开始,即包括和最后一个右括号之前的所有内容。结合它们,你应该得到除最后一个括号之外的所有东西。即使任何文件名中还包含其他括号,这也应该有效。

请注意,这种脚本移动很棘手,可能会阻止您的文件名。我建议在上面使用echo而不是mv来确认它是否真的为每个文件做了正确的事情,首先。

双引号也很重要,因为文件名中有空格。

如果您想在开括号前删除最后一个空格,只需将其包含在第一个模式中:${FILE% (*}

答案 2 :(得分:0)

这个怎么样?

rename 's/\s\([^\)]+\)//' *.*

我们可以感谢Larry Wall。