如何使用bash重命名具有序号的文件?

时间:2018-09-27 12:32:29

标签: bash file rename

我在同一目录中有308,000个文件,这些文件使用我想保留的重要信息来命名:

例如

"f_500_0.1_0.005_150_25.gen"
"f_500_0.1_0.005_150_26.gen"
"f_500_0.1_0.005_150_27.gen"
 [...]
"f_1000_0.1_0.005_150_25.gen"
"f_1000_0.1_0.005_150_26.gen"
"f_1000_0.1_0.005_150_27.gen"

我想通过在每个文件名的开头添加一个数字来重命名所有这些文件,顺序为从1到12,直到为所有308,000个文件分配了一个数字,如下所示:

# First 12 files:
"1_f_500_0.1_0.005_150_25.gen"
"2_f_500_0.1_0.005_150_26.gen"
[...]
"10_f_500_0.1_0.005_150_27.gen"
"11_f_500_0.1_0.005_150_28.gen"
"12_f_500_0.1_0.005_150_29.gen" 
# (and then again from 1 to 12 for the next 12 files:)  
"1_f_1000_0.1_0.005_150_25.gen"
"2_f_1000_0.1_0.005_150_26.gen"
[...]
"10_f_1000_0.1_0.005_150_27.gen"
"11_f_1000_0.1_0.005_150_28.gen"
"12_f_1000_0.1_0.005_150_29.gen" 
 # (and so on until all 308,000 files are renamed)

最后,我只想拥有文件名以“ 1_f ...”开头的文件,而不是文件名以“ 2_f ..”开头的文件,依此类推。如何在Unix Shell中做到这一点?我不太流利。

非常感谢!

1 个答案:

答案 0 :(得分:1)

使用bash中的for循环非常简单。

您可以使用ls命令到for命令的输出来循环遍历目录中的所有文件。您需要一个存储索引的变量,并且可以在循环中对其进行更新。

export i=1
for f in $(ls)
do
   # Copy file to new location, safer than move in case you make a mistake
   cp $f ../new_directory/$i"_"$f -v

   # Increment
   let i=i+1
   # Reset if exceeds 12
   if [ $i -gt 12 ]
   then
      export i=1
   fi
done

您将必须在files目录中,并且必须创建new_directory。最好的运行方式是将其另存为脚本,然后执行。