Bash / Batch несколько файлов, одна папка, сценарий инкриментального переименования;предоставленный пользователем параметр префикса имени файла - PullRequest
0 голосов
/ 11 августа 2011

У меня есть папка с файлами, которые нужно переименовать.

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

скажи, что у меня есть файлы:

wei12346.txt
wifr5678.txt
dkgj5678.txt

которые необходимо переименовать в:

Eac-345-018.txt
Eac-345-019.txt
Eac-345-020.txt

Каждый раз, когда я запускаю сценарий, наименование может отличаться, и числовое значение для его согласования также может быть различным:

Ebc-345-010.pdf
Ebc-345-011.pdf
Ebc-345-012.pdf

Поэтому мне нужно запросить предоставленный параметр у пользователя, я подумал, что это может быть полезно в качестве предыдущего имени файла в списке файлов для индексации, например: Eac-345-017.txt

Другая вещь, в которой я не уверен насчет инкремента, заключается в том, как сценарий справится с инкриминированием от 099 до 100 или от 999 до 1000, поскольку я не знаю, как осуществляется этот процесс.

Мне сказали, что это простой скрипт на Perl, однако я запускаю cygwin на компьютере с Windows в работе и имею доступ только к оболочкам bash и windows для выполнения сценария.

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

Спасибо, Craig

(я понимаю, что по этому типу вещей уже есть много постов, но ни один из них не дает краткого ответа, поэтому мой вопрос)

Ответы [ 2 ]

0 голосов
/ 11 августа 2011
#!/bin/bash

prefix="$1"
shift

base_n="$1"
shift

step="$1"
shift

n=$base_n

for file in "$@" ; do
    formatted_n=$(printf "%03d" $n)
    # re-use original file extension whilke we're at it.
    mv "$file" "${prefix}-${formatted_n}.${file##*.}"
    let n=n+$step
done

Сохраните файл, вызовите его так:

bash fancy_rename.sh Ebc-345- 10 1 /path/to/files/*

Примечание: в вашем примере вы "переименовали" .txt в .pdf, но выше я предположил, что расширение останется прежним. Если вы действительно хотите просто изменить расширение, это будет тривиальное изменение. Если вы хотите на самом деле преобразовать формат файла, то это будет немного сложнее.

Обратите внимание также, что я отформатировал увеличивающий номер с %03d. Это означает, что ваша числовая последовательность будет, например,

010
011
012
...
099
100
101
...
999
1000

Это означает, что он будет дополнен нулями до трех мест, но автоматически переполнится, если число будет больше. Если вы предпочитаете последовательность (всегда 4 цифры), вы должны изменить заполнение на %04d.

0 голосов
/ 11 августа 2011

ОК, вы можете сделать следующее.Вы можете задать пользователю сначала префикс, а затем начальный порядковый номер.Затем вы можете использовать встроенный printf из bash для правильного форматирования чисел, но вам, возможно, придется решить предоставить достаточную ширину номера, чтобы вместить всю последовательность, потому что это приведет к более однородномуимена.Вы можете использовать read для чтения ввода пользователя:

echo -n "Insert the prefix: "
read prefix
echo -n "Insert the sequence number: "
read sn

for i in * ; do
  fp=`printf %04d $sn`
  mv "$i" "$prefix-$fp.txt"
  sn=`expr $sn + 1`
done

Примечание: Вы также можете извлечь расширение.Это не будет проблемой.Также здесь я выбрал 4 числа для порядкового номера, вычисленные в переменную $fp.

...