目的
更改这些文件名:
F00001-0708 RG-biasliuyda
F00001-0708-CS-akgdlaul
F00001-0708-VF-hioulgigl
这些文件名:
F0001-0708-RG-biasliuyda
F0001-0708-CS-akgdlaul
F0001-0708-VF-hioulgigl
壳牌代码
去测试:
ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/'
去表演:
ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' | sh
我的问题
我不明白sed代码.我理解替换命令是什么
$ sed 's/something/mv'
手段.我有点理解正则表达式.但我不明白这里发生了什么:
\(.\).\(.*\)
或者在这里:
& \1\2/
对我来说,前者看起来就像是:"一个角色,后跟一个角色,然后是单个角色的任何长度序列" - 但肯定还有更多的东西.至于后一部分:
& \1\2/
我不知道.我真的很想了解这段代码.伙计们,请帮帮我.
首先,我应该说最简单的方法是使用prename或rename命令.
在Ubuntu,OSX(Homebrew包rename
,MacPorts包p5-file-rename
)或其他具有perl重命名(prename)的系统上:
rename s/0000/000/ F0000*
或者在从util-linux-ng重命名的系统上,例如RHEL:
rename 0000 000 F0000*
这比同等的sed命令更容易理解.
但至于理解sed命令,sed联机帮助页很有帮助.如果你运行man sed并搜索&(使用/ command搜索),你会发现它是s/foo/bar/replacementments中的特殊字符.
s/regexp/replacement/ Attempt to match regexp against the pattern space. If success? ful, replace that portion matched with replacement. The replacement may contain the special character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp.
因此,\(.\)
匹配第一个字符,可以引用\1
.然后.
匹配下一个字符,该字符始终为0.然后\(.*\)
匹配文件名的其余部分,可以引用\2
.
替换字符串使用&
(原始文件名)将它们全部放在一起\1\2
,除了第二个字符(0)之外,它是文件名的每个部分.
恕我直言,这是一个非常神秘的方式.如果出于某种原因,重命名命令不可用并且您想使用sed进行重命名(或者您可能正在为重命名做一些过于复杂的事情?),在正则表达式中更明确地使它更具可读性.也许是这样的:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
能够看到s/search/replacement /中实际发生的变化使其更具可读性.如果您不小心运行两次或其他东西,它也不会继续从文件名中吸取字符.
你有你的sed解释,现在你可以只使用shell,不需要外部命令
for file in F0000* do echo mv "$file" "${file/#F0000/F000}" # ${file/#F0000/F000} means replace the pattern that starts at beginning of string done
sed
几年前我写了一篇关于批量重命名的例子的小帖子:
http://www.guyrutenberg.com/2009/01/12/batch-renaming-using-sed/
例如:
for i in *; do mv "$i" "`echo $i | sed "s/regex/replace_text/"`"; done
如果正则表达式包含组(例如\(subregex\
),那么您可以在替换文本中使用它们\1\
,\2
等等.
最简单的方法是:
for i in F00001*; do mv "$i" "${i/F00001/F0001}"; done
或者,便携地,
for i in F00001*; do mv "$i" "F0001${i#F00001}"; done
这将替换F00001
文件名中的前缀F0001
.在这里得到mahesh:http://www.debian-administration.org/articles/150
该sed
命令
s/\(.\).\(.*\)/mv & \1\2/
意味着要取代:
\(.\).\(.*\)
有:
mv & \1\2
就像常规sed
命令一样.但是,括号&
和\n
标记会稍微改变它.
搜索字符串匹配(并记忆为模式1)开头的单个字符,后跟单个字符,后跟字符串的其余部分(记为模式2).
在替换字符串中,您可以参考这些匹配的模式以将其用作替换的一部分.您也可以将整个匹配部分称为&
.
所以该sed
命令正在做的是创建一个mv
基于原始文件(对于源)和字符1和3以及之前的命令,有效地删除字符2(对于目标).它将为您提供以下格式的一系列行:
mv F00001-0708-RG-biasliuyda F0001-0708-RG-biasliuyda mv abcdef acdef
等等.