我在同一目录中有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中做到这一点?我不太流利。
非常感谢!
答案 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
。最好的运行方式是将其另存为脚本,然后执行。