Bash 替换括号之间的所有字符

Bash 替换括号之间的所有字符,bash,Bash,我刚从Windows8过来,现在遇到了一个大问题。我现在使用的是Ubuntu12.10,我使用FileHistory将数据备份到外部硬盘,现在除了在文件名中添加时间戳外,所有文件都已备份 我需要删除括号中以“(2012_)”开头,以“)”结尾的所有内容 有人能帮我吗?下面是我试图修复的文件列表的屏幕截图: 任何帮助都将不胜感激 谢谢,单向: 当前文件: $ ls -l total 0 -rw-r--r-- 1 guru None 0 Dec 1 09:14 a (2002).iso -rw-

我刚从Windows8过来,现在遇到了一个大问题。我现在使用的是Ubuntu12.10,我使用FileHistory将数据备份到外部硬盘,现在除了在文件名中添加时间戳外,所有文件都已备份

我需要删除括号中以“(2012_)”开头,以“)”结尾的所有内容

有人能帮我吗?下面是我试图修复的文件列表的屏幕截图:

任何帮助都将不胜感激

谢谢,

单向:

当前文件:

$ 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

您可以这样做:

用于*中的文件;做
mv“$FILE”“${FILE%(*}${FILE##*)}”
完成
这是因为
${FILE%(*}
从右侧移除了
(*
中的最小匹配项,即包括最后一个开括号和之后的所有内容,而
${FILE##*)}
从左侧移除了最大匹配项
*)
,即包括最后一个闭括号和之前的所有内容。将它们结合起来,您应该得到除最后一个括号之外的所有内容。即使任何文件名中还有其他括号,也应该可以这样做

注意,这种脚本移动很棘手,可能会把文件名搞砸。首先,我建议使用
echo
而不是上面的
mv
,以确认它对每个文件都做了正确的事情

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

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

这个如何

rename 's/\s\([^\)]+\)//' *.*
我们可以为此感谢拉里·沃尔