Использование bash для добавления имен файлов - PullRequest
0 голосов
/ 22 января 2020

Надеюсь, этот вопрос не слишком абстрактный, поскольку я немного новичок в bash программировании. У меня есть группа файлов, имя которых включает два числа (то есть gas13_14.5.png), и мне интересно, есть ли способ в оболочке переименовать файл в комбинацию из двух (gas27.5.png), используя bash. Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Если формат вашего имени файла не изменяется, вы можете попробовать следующее:

i=gas13_14.5.png
j=(${i//[^0-9]/ }) # a bash array [13, 14, 5]
mv "$i" "${i/${j[0]}_${j[1]}/$((j[0]+j[1]))}" # Thanks for the comments
#echo "${i/${j[0]}_${j[1]}/`expr ${j[0]} + ${j[1]}`}" ## My original try

Пусть $i будет именем файла, затем установите $j в качестве массива, содержащего все числа в * 1006. * (для этого сначала нужно заменить нецифры на пробелы и преобразовать их в массив).

Последний шаг - заменить числовую часть ${j[0]}_${j[1]} на требуемое число expr ${j[0]} + ${j[1]}.

Если у вас есть несколько файлов, оберните их в al oop:

for i in *.png
do
  j=(${i//[^0-9]/ })
  mv "$i" "${i/${j[0]}_${j[1]}/$((j[0]+j[1]))}"
done
2 голосов
/ 22 января 2020

Это поможет:

ls gas13_14.5.png |\
  gawk 'match($0, /^([a-z]+)([0-9]+)_([0-9]+)(\..*)$/,a){print $0,a[1]""a[2]+a[3]""a[4]}'| xargs -n2 mv

Вывод ls передается в awk, затем мы используем $ 0, чтобы напечатать строку без изменений, другими словами, оригинальное имя файла.

Следующим шагом является использование групп захвата регулярных выражений для изменения имени файла (a[1]""a[2]+a[3]""a[4]).

Результатом является комбинированный вывод, состоящий из последовательности old_file_name и new_file_name .

Наконец, мы передаем результирующий канал через xargs, чтобы получить эффективное переименование файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...