按顺序重命名文件,保留名称

时间:2017-05-24 22:59:34

标签: regex bash shell command-line rename

我有这些文件:

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并最好使用正则表达式(我正在努力学习更好)。

4 个答案:

答案 0 :(得分: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上的回声放在前面。如果结果看起来不错,请取出回声。以下是我的结果:

[jack@marta ~]$ 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
[jack@marta ~]$ 

答案 1 :(得分:2)

您可以通过使用bash参数替换来实现此目的:

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

d变量设置为文件名中的最后一位,然后将其替换为mv

答案 2 :(得分:1)

使用Bash正则表达式:

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

当输出似乎正确时,可以删除echo

如果目标不是增加输入文件编号,而是从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,......

答案 3 :(得分:0)

未经测试,因为我不在电脑前,但根据您自己在rename的努力,这应该是关闭的:

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

split应该把所有内容放在" .csv。"之前。进入$a及其后的所有内容$b。第二部分将输出($_)设置为$a,然后将$b+1设置为" .csv"追加。