Как переименовать файлы по порядку

Поскольку вы специально спрашивали об «использовании awk»

awk -F- '
  /^>/ {hdr=$0; next} 
  {print hdr ORS $1; for(i=2;i<=NF;i++) print hdr"_"i ORS $i}
' file
0
02.07.2019, 19:39
2 ответа

Как хакерский bashскрипт:

#!/bin/bash
while IFS= read -r file; do
  newprefix=${file%%_Data*}
  if [ "$prefix" != "$newprefix" ]; then
    cnt=1
    prefix=$newprefix
  fi
  newfile=$(echo "$file" | sed "s/[0-9]*\(_Image.txt\)/$cnt\1/")
  echo mv "$file" "$newfile"
  ((cnt++))
done < <(find. -maxdepth 1 -type f -name '*.txt' | sort -nt_ -k2,2 -k7,7)

Выход:

$./script.sh
mv./FoilHole_6862563_Data_6834945_6834947_20190608_255634_Image.txt./FoilHole_6862563_Data_6834945_6834947_20190608_1_Image.txt
mv./FoilHole_6862563_Data_6834952_6834954_20190608_255710_Image.txt./FoilHole_6862563_Data_6834952_6834954_20190608_2_Image.txt
mv./FoilHole_6862563_Data_6834959_6834961_20190608_255748_Image.txt./FoilHole_6862563_Data_6834959_6834961_20190608_3_Image.txt
mv./FoilHole_6862563_Data_6834935_6834937_20190608_255827_Image.txt./FoilHole_6862563_Data_6834935_6834937_20190608_4_Image.txt
mv./FoilHole_6862563_Data_6834967_6834969_20190608_255906_Image.txt./FoilHole_6862563_Data_6834967_6834969_20190608_5_Image.txt
mv./FoilHole_6862568_Data_6834945_6834947_20190608_060123_Image.txt./FoilHole_6862568_Data_6834945_6834947_20190608_1_Image.txt
mv./FoilHole_6862568_Data_6834952_6834954_20190608_060159_Image.txt./FoilHole_6862568_Data_6834952_6834954_20190608_2_Image.txt
mv./FoilHole_6862568_Data_6834959_6834961_20190608_360237_Image.txt./FoilHole_6862568_Data_6834959_6834961_20190608_3_Image.txt
mv./FoilHole_6862568_Data_6834935_6834937_20190608_460316_Image.txt./FoilHole_6862568_Data_6834935_6834937_20190608_4_Image.txt
mv./FoilHole_6862568_Data_6834967_6834969_20190608_560354_Image.txt./FoilHole_6862568_Data_6834967_6834969_20190608_5_Image.txt

Переменная-счетчик cntсбрасывается на 1при каждом изменении префикса имени файла, например. когда ./FoilHole_6862563изменится на ./FoilHole_6862568. Чтобы действительно переименовать файлы, вы должны удалить echoв скрипте.

0
28.01.2020, 03:30

Вы можете комбинировать bashарифметику с командой rename:

i=0
find. -maxdepth 1 -type f -name '*.txt' |
sort -nt_ -k2,2 -k7,7 |
while read filename ; do
    rename -v "s/[0-9]+_Image/$((i%5+1))_I/" ${filename}
    i=$((i+1))
done

Попробуйте это с опцией -nкоманды rename, которая просто показывает, что делается.

ПРЕДУПРЕЖДЕНИЕ:

Имена файлов берутся из входных данных по каналу, а переменная filenameустанавливается с помощью встроенного здесь read. Это БУДЕТ прервано, если ваши имена файлов не соответствуют формату, который вы указали в своем вопросе, например. имена файлов с пробелами, новыми строками и т. д. Так что имейте в виду, что вам нужно будет использовать другой подход, например. Опция find-print0в сочетании с xargs -0.

В этом случае используется вспомогательный файл для счетчика и ?используется как замена переменной:

echo -1 > file_counter
find -name '*txt' -print0 |
sort -znt_ -k2,2 -k7,7 |
xargs -I ? -0 bash -c '
     i=$(($(cat file_counter)+1))
     rename -n -v "s/[0-9]+_Image/$(($i%5+1))/"  ?
     echo $i > file_counter
'
0
28.01.2020, 03:30

Теги

Похожие вопросы