1

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

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很好一般解决方案不仅适用于此示例。

4

3 回答 3

2

这应该工作:

for x in ~/tmp/*.txt; do mv $x `echo $x | sed -e 's#hell#hello#'`; done
于 2013-03-27T11:20:14.930 回答
0

如果我了解您希望将任何“hell.*_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”或“1”或...或“9”的“[0-9]”

(如果您想知道为什么在某些语言环境中添加 LC_COLLATE:[A-Z]可以匹配每个字母 AZ 或 ay(“z”除外!),因为在这种语言环境中,字母按以下顺序出现:“A”“a”“B”“b”.. . 'Z' 'z'. 还有其他语言环境,谁知道?)

(注意:您也可以用“[[:digit:]] ”表示法替换“[0-9]”,但它可能不太便携:“旧”版本的 sed 不会知道这种表示法并会尝试匹配任何'['或':'或......或't'或':',后跟']'(*,所以0,1或更多次)......这就是为什么我不就像将那些特殊的 [[:things:]] 与 sed、tr 等一起使用:我认为它们的便携性较差。如果您更喜欢使用这些,请改用 perl?)

于 2013-03-27T13:23:43.417 回答
0

怎么样

rename 's/hell_/hello_/' /tmp/*.txt
于 2013-03-27T11:32:22.267 回答