2017-05-24 62 views
0

的第一部分,我有这些文件:重命名文件顺序保持名称

NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.0 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.1 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.2 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.3 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.4 

而且我想改名是这样的:

NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_1.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_2.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_3.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_4.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_5.csv 

我试过以下(和一些变化),但没有得到成功:

rename -v 's/(NIHMS.+tons).csv.+/\1_[0-9]\.csv/' *.csv* 

ls *csv* | sed -E 's/(NIHM.+tons)\.csv.*$/\1_{1..5}.csv/' 

ls *csv* | cat -n | while read n f; do mv "$f" "$f_$n.csv"; done 

我用的是最后一个,给了最近我喜欢:

1.csv 2.csv 3.csv 4.csv 5.csv 

我敢肯定,我可以使用python做到这一点,但我正在努力通过命令行/ bash,最好使用正则表达式(我试图更好地学习)。

+1

这似乎增加了一个数字,但接受的答案没有。真正需要的行为是什么? –

+0

@Benjamin W.我解释了我自己想要的东西,我甚至发布了一个期望输出的例子。我说的最后一件事是举例说明我得到的不是我想要的。 –

+1

是的,根据问题中所需的输出,编号从0,1,2,3,4变为1,2,3,4,5,但接受的答案直接映射。 –

回答

2

与SED创建新名称,保存文件名部分和交换他们:

for file in *.csv.[0-9]*; do 
    new_name=$(echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/\1_\2.csv/') 
    echo mv $file $new_name 
done 

为了安全起见,我把回声在前面的MV。如果结果看起来不错,请取出回声。下面是我的结果:你可以这样做

[[email protected] ~]$ for file in *.csv.[0-9]*; do new_name=$(echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/\1_\2.csv/'); echo mv $file $new_name; done 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.0 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_0.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.1 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_1.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.10 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_10.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.11 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_11.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.2 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_2.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.3 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_3.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.4 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_4.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.5 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_5.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.6 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_6.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.7 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_7.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.8 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_8.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.9 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_9.csv 
[[email protected] ~]$ 
2

的方法之一是使用bash参数替换:

for f in *.csv.* ; do d="${f##*.}" ; mv "$f" "${f%*.csv*}__$((d+1)).csv" ; done 

d变量被设置为文件名的最后一个数字,然后替代它, mv

+0

这个数字在这里没有增加,是吗? –

+0

@BenjaminW:不,它使用文件名中的一个。 –

+0

但是应该增加,如果你看看所需的名字。 –

1

使用bash的正则表达式:

re='(.*)\.csv\.([[:digit:]]+)$' 
for f in *; do 
    [[ $f =~ $re ]] 
    echo mv "$f" "${BASH_REMATCH[1]}_$((${BASH_REMATCH[2]} + 1)).csv" 
done 

echo可以在输出似乎是正确的去除。

如果目标不是incremenent输入文件号码,但按顺序编号从1开始的文件,可以将代码更改为以下:

re='(.*)\.csv\.[[:digit:]]+$' # Just one capture group 
i=1 
for f in *; do 
    [[ $f =~ $re ]] 
    echo mv "$f" "${BASH_REMATCH[1]}_$((i++)).csv" 
done 

现在的文件将被编号为1,2 ,3,...按字母顺序输入。

0

未经检验的,因为我不是在电脑前,而是基于与rename自己的努力,这应该是接近:“.csv”文件

rename -n '($a,$b)=split /.csv./; $_=$a . ($b+1) . ".csv"' *csv* 

split应该把以前的一切分成$a及其后的所有内容分成$b。第二部分将输出($_)设置为$a,然后将$b+1设置为“.csv”。