Переименование нескольких файлов путем добавления целочисленного значения 1 - PullRequest
0 голосов
/ 21 мая 2019

У меня есть несколько файлов SVG .... и мне нужно переименовать их, добавив 1.

0.svg  -->  1.svg
1.svg  -->  2.svg
2.svg  -->  3.svg

и т.д ...

Что было бы лучшим способом сделать этоиспользуя терминал Linux?

Ответы [ 3 ]

1 голос
/ 21 мая 2019

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

while IFS= read -r num; do
    new="$(( num + 1 )).svg"
    mv -- "$num.svg" "$new"
done < <(
for f in *.svg; do
    n=${f%.svg}
    echo "$n"
done | sort -rn
)
1 голос
/ 21 мая 2019

Этот Shellcheck -чистый код предназначен для безопасной и чистой работы независимо от того, что находится в текущем каталоге:

#! /bin/bash -p

shopt -s nullglob   # Globs that match nothing expand to nothing
shopt -s extglob    # Enable extended globbing (+(...), ...)

# Put the file base numbers in a sparse array.
# (Bash automatically keeps such arrays sorted by increasing indices.)
sparse_basenums=()
for svgfile in +([0-9]).svg ; do
    # Skip files with extra leading zeros (e.g. '09.svg')
    [[ $svgfile == 0[0-9]*.svg ]] && continue

    basenum=${svgfile%.svg}
    sparse_basenums[$basenum]=$basenum
done

# Convert the sparse array to a non-sparse array (preserving order)
# so it can be processed in reverse order with a 'for' loop
basenums=( "${sparse_basenums[@]}" )

# Process the files in reverse (i.e. decreasing) order by base number
for ((i=${#basenums[*]}-1; i>=0; i--)) ; do
    basenum=${basenums[i]}
    mv -i -- "$basenum.svg" "$((basenum+1)).svg"
done
  • shopt -s nullglob предотвращает плохое поведение, если в каталоге нет файлов, имена которых представляют собой десятичное число, за которым следует «.svg». Без этого код будет пытаться обработать файл с именем '+ ([0-9]). Svg'.
  • shopt -s extglob включает более богатый набор шаблонов сглаживания, чем по умолчанию. Подробности см. В разделе «extglob» в glob - Wiki Грега .
  • Полезность sparse_basenums зависит от того факта, что массивы Bash могут иметь произвольные неотрицательные целочисленные индексы, что массивы с пробелами в их индексах эффективно хранятся (разреженные массивы), и что элементы в массивах всегда хранятся в порядке увеличения индекса. См. Массивы (Справочное руководство Bash) для получения дополнительной информации.
  • Код пропускает файлы, имена которых имеют дополнительные начальные нули ('09 .svg ', но не' 0.svg '), потому что он не может обрабатывать их безопасно, как сейчас. Попытка обработать '09' как число вызывает ошибку, потому что это рассматривается как недопустимое восьмеричное число. Это легко исправить, но могут возникнуть проблемы, если, например, у вас есть и «9.svg», и «09 .svg» (они оба естественно будут переименованы в «10 .svg») .
  • Код использует mv -i для запроса ввода пользователя в случае, если что-то идет не так, и он пытается переименовать файл в тот, который уже существует.
  • Обратите внимание, что код будет молча делать неправильные вещи (из-за арифметического переполнения), если числа слишком велики (например, «99999999999999999999.svg»). Проблема исправима.
1 голос
/ 21 мая 2019

Хитрость заключается в обработке файлов в обратном направлении, чтобы вы не перезаписывали существующие файлы при переименовании.Используйте расширение параметров для извлечения чисел из имен файлов.

#!/bin/bash
files=(?.svg)
for (( i = ${#files[@]} - 1; i >= 0; --i )) ; do
    n=${files[i]%.svg}
    mv $n.svg $(( n + 1 )).svg
done

Если файлы могут иметь имена различной длины (например, 9.svg, 10.svg), решение будет более сложным, так как вам нужно отсортировать файлычисленно, а не лексикографически.

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