bash文件重命名在特定位置添加字符串

时间:2013-03-27 11:09:34

标签: string bash unix

我想重命名多个文件,但不只是将我的字符串附加到文件的末尾或开头。我想把它放在一个特定的位置。这是我正在使用的命令,但它只能在文件名的开头和结尾添加内容。

for f in `ls  ~/tmp/*`; do FILE=`basename $f`; echo "Rename:"$f;echo $FILE; mv "$f" "/home/tmp/JC_"${FILE%.*}"_hg19."${FILE#*.}"";  done

让我们说文件名如下hell_1.txt(为了简单起见,我们可以说有很多文件名都有不同的编号)我想在文件名中添加o所以结果名称将是hello_1.txt如果你有一个通用的解决方案,不仅仅是这个例子,这将是很好的。

3 个答案:

答案 0 :(得分:2)

这应该有效:

for x in ~/tmp/*.txt; do mv $x `echo $x | sed -e 's#hell#hello#'`; done

答案 1 :(得分:0)

怎么样

rename 's/hell_/hello_/' /tmp/*.txt

答案 2 :(得分:0)

如果我理解你想要将任何“地狱。* _ NNN.txt”更改为“hel。* o_NNN.txt”(将。*保持在“hell”和“_NNN.txt”之间(NNN为任意数字)。

然后:

for x in ~/tmp/*.txt; do 
   mv "$x" "$(echo "$x" | LC_COLLATE=C sed -e 's#\(hell.*\)\(_[0-9]*\.txt$\)#\1o\2#')"
done

我在sed调用期间添加了LC_COLLATE = C,因此你可以依赖“[0-9]”只匹配数字'0'或'1'或......或'9'

(如果你想知道为什么添加LC_COLLATE:某些区域设置[A-Z]可以匹配每个字母AZ或ay(除了'z'!),因为在这样的区域设置中,字母按此顺序出现:'A''a' 'B''b'...'Z''z'。还有其他语言环境,谁知道?)

(注意:您也可以用“[[:digit:]] ”符号替换“[0-9] ”,但它可能不太便携:sed的“旧”版本我不会知道这个符号,并试图匹配任何'['或':'或......或't'或':',然后是']'(*,所以0,1或更多次)...这就是为什么我不喜欢使用sed,tr等特殊的[[:things:]]:我认为它们不那么便携。如果你喜欢使用它们,请使用perl吗?)