Как считать элементы в массиве с ведущими нулями в скрипте bash? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть все oop, которые просматривают файлы в директории и переименовывают их.

for f in *
   do
      mv -n "$f" "$prefix_$(date -r "$f" +"%Y%m%d").${f#*.}"
   done

Мне нужно добавить порядковый номер в конце, как

TEST_20200505_00001.NEF
TEST_20200505_00002.NEF
TEST_20200505_00155.NEF

Как я могу go сделать это?

1 Ответ

4 голосов
/ 04 мая 2020

Добавьте переменную, которая считает каждую итерацию l oop. Затем используйте printf для добавления начальных нулей.

#! /usr/bin/env bash
c=1
for f in *; do
  mv -n "$f" "${prefix}_$(date -r "$f" +%Y%m%d)_$(printf %05d "$c").${f#*.}"
  (( c++ ))
done

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

#! /usr/bin/env bash
files=(*)
while read i; do
  f="${files[10#$i]}"
  mv -n "$f" "${prefix}_$(date -r "$f" +%Y%m%d)_$i.${f#*.}"
done < <(seq -w 0 "$((${#files[@]}-1))")

При этом будут использоваться цифры 1-ди git, если имеется только до 9 файлов, и 2 цифры, если есть всего 10–99 файлов, 3 цифры для 100–999 файлов и т. д.

Если вам интересно, что 10#$i: Bash интерпретирует числа с ведущими нулями как восьмеричные числа, то есть 010 = 8 и 08 = ошибка. Чтобы правильно интерпретировать числа, сгенерированные seq -w, мы указываем базу вручную, используя префикс 10#.

...