按顺序重命名文件,保留名称的第一部分
Rename files sequentially keeping first part of name
我有这些文件:
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.+/_[0-9]\.csv/' *.csv*
和
ls *csv* | sed -E 's/(NIHM.+tons)\.csv.*$/_{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 来做到这一点,但我正在尝试通过命令 line/bash 并且最好使用正则表达式(我正在尝试更好地学习)。
使用 sed 创建新名称,保存文件名的各个部分并交换它们:
for file in *.csv.[0-9]*; do
new_name=$( echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/_.csv/' )
echo mv $file $new_name
done
为了安全起见,我把echo放在了mv前面。如果结果看起来不错,取出回声。这是我的结果:
[jack@marta ~]$ for file in *.csv.[0-9]*; do new_name=$(echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/_.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 ~]$
一种方法是使用 bash 参数替换:
for f in *.csv.* ; do d="${f##*.}" ; mv "$f" "${f%*.csv*}__$((d+1)).csv" ; done
d
变量设置为文件名中的最后一位,然后在 mv
中替换它。
使用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 ...。
未测试,因为我不在电脑前,但根据您自己对 rename
的努力,这应该很接近:
rename -n '($a,$b)=split /.csv./; $_=$a . ($b+1) . ".csv"' *csv*
split
应将所有内容放在“.csv”之前。进入 $a
之后的所有内容进入 $b
。第二部分将输出 ($_
) 设置为 $a
,然后是 $b+1
并附加“.csv”。
我有这些文件:
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.+/_[0-9]\.csv/' *.csv*
和
ls *csv* | sed -E 's/(NIHM.+tons)\.csv.*$/_{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 来做到这一点,但我正在尝试通过命令 line/bash 并且最好使用正则表达式(我正在尝试更好地学习)。
使用 sed 创建新名称,保存文件名的各个部分并交换它们:
for file in *.csv.[0-9]*; do
new_name=$( echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/_.csv/' )
echo mv $file $new_name
done
为了安全起见,我把echo放在了mv前面。如果结果看起来不错,取出回声。这是我的结果:
[jack@marta ~]$ for file in *.csv.[0-9]*; do new_name=$(echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/_.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 ~]$
一种方法是使用 bash 参数替换:
for f in *.csv.* ; do d="${f##*.}" ; mv "$f" "${f%*.csv*}__$((d+1)).csv" ; done
d
变量设置为文件名中的最后一位,然后在 mv
中替换它。
使用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 ...。
未测试,因为我不在电脑前,但根据您自己对 rename
的努力,这应该很接近:
rename -n '($a,$b)=split /.csv./; $_=$a . ($b+1) . ".csv"' *csv*
split
应将所有内容放在“.csv”之前。进入 $a
之后的所有内容进入 $b
。第二部分将输出 ($_
) 设置为 $a
,然后是 $b+1
并附加“.csv”。