文件重命名(取1份文件名并将其转移到文件名的'开头')

时间:2013-04-22 14:11:42

标签: linux bash

好的,我有很多文件都包含版本号v1或v2。我想将文件名与其他文件匹配,这些文件组成第二个文件,如下所示: train.v1_GENENAME_ID.debruijn.txt(这就是我想要的)

第一个文件的组成如下: train.GENENAME_ID_v1.debruijn.txt

所以v1应该在GENENAME之前移动。所有版本标识符都相同。即v1或v2

假设我有一个名为'train.Glis2_1757.2_v1_deBruijn.txt'的文件,我想将其转换为此'train.v1_Glis2_1757.2_deBruijn.txt'

是否有一种简单的方法可以从第一个文件名中取出v1并将其放在第二个文件名中?

我在考虑将grep与if语句结合使用。但仍未设法使其发挥作用。

感谢任何提示/提示。

3 个答案:

答案 0 :(得分:2)

使用与perl分发的rename

rename 's/(train.)(.*_)(v[0-9].)(deBruijn.txt)/$1$3$2$4/' *

在某些系统上,它被称为'ren'或'pren'。

答案 1 :(得分:1)

这是一个使用for循环并使用sed转换文件名

的人
for f in *.txt;
do
    nf=$(echo $f | sed -r 's/([^.]+\.)([^.]+\.)([0-9])_([^_]+)(.*)/\1\4_\2\3\5/')
    echo mv $f $nf
done

如果您对结果感到满意,可以删除echo并重命名

根据您的要求,此处是带注释的版本,说明如何提取和重新排列各个部分以适合所需的输出

echo "train.Glis2_1757.2_v1_deBruijn.txt" | sed -r 
's/([^.]+\.) # match all non-dot characters (+ meaning one or more) followed by a dot and store in group 1 (train.)
   ([^.]+\.) # match all non-dot characters followed by a dot and store in group 2 (Glis2_1757.)
   ([0-9])   # match a single digit and store in group 3 (2)
   _         
   ([^_]+)   # match all non-underscore characters and store in group 4 (v1)
   (.*)      # match all that follow . is a wildcard char in regex and * is for zero or more (_deBruijn.txt)
/\1\4_\2\3\5/' # rearranging the matches to get desired output

答案 2 :(得分:1)

你可以在parameter expansion的shell中执行此操作,特别是后缀和前缀删除:

FN=train.Glis2_1757.2_v1_deBruijn.txt
STRIPPED=${FN%_deBruijn.txt}                      # "train.Glis2_1757.2_v1"
GENEVERS=${STRIPPED#train.}                       # "Glis2_1757.2_v1"
VERSION=${GENEVERS##*_}                           # "v1"
GENENAME=${GENEVERS%_v[12]}                       # "Glis2_1757.2"

NEWFN=train.${VERSION}_${GENENAME}_deBruijn.txt   # "train.v1_Glis2_1757.2_deBruijn.txt"

mv $FN $NEWFN

您不必完成上述所有明确的命名步骤,但我认为更清楚。此外,这种技术可以推断为具有任意前缀(除了“train。”)和后缀(除“_deBruijn.txt”之外),假设您可以使用shell模式表示法来表示它们。