Bash 替换括号之间的所有字符
我刚从Windows8过来,现在遇到了一个大问题。我现在使用的是Ubuntu12.10,我使用FileHistory将数据备份到外部硬盘,现在除了在文件名中添加时间戳外,所有文件都已备份 我需要删除括号中以“(2012_)”开头,以“)”结尾的所有内容 有人能帮我吗?下面是我试图修复的文件列表的屏幕截图: 任何帮助都将不胜感激 谢谢,单向: 当前文件: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-
$ 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\([^\)]+\)//' *.*
我们可以为此感谢拉里·沃尔