Как переименовать файлы с последовательными номерами с помощью bash? - PullRequest
0 голосов
/ 27 сентября 2018

У меня 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?Я не владею Bash.

Большое спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

Это довольно просто с циклом for в bash.

Вы можете перебрать все файлы в каталоге, используя вывод команды 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

Вы должны будете находиться в каталоге файлов и создать new_directory.Лучший способ запустить это сохранить его как скрипт и выполнить.

...