Попытка сделать арифметику в Perl переименовывает инструмент (Debian)

Вы могли использовать jsvc от Apache проект палаты общин. Необходимо будет все еще записать init использование сценария jsvc,все же.

8
24.07.2015, 05:00
2 ответа

У Вас почти был он. Просто необходимо сделать литеральные строки и конкатенацию строк явными в /e- измененная замена, с помощью кавычек и точечного оператора.

rename 's/0([2-4])([\s\S]+)/"0".($1+1).$2/e' *
7
27.01.2020, 20:11
  • 1
    Это оставляет оригинал 05 все еще непереименованным, но +1 для разрешения незначительного сбоя остроты. –  Peter.O 03.09.2012, 11:16
  • 2
    (незначительное примечание, переименуйте, назван предварительным именем в Ubuntu)... Если никакие имена в каталоге не запускаются с $'\x01'2 затем предварительное переименование как это: prename 's/^05/\x012/' 05* .. затем вышеупомянутое [2-4] переименовать.. затем финал prename 's/^\x01/0/' $'\x01'2* добьется цели.. Это делает 3 остроты... Для одной четверти и начальной проверки на возможное присутствие файла, запускающегося с $'\x01', что-то вроде этого колотит отрывок, захватит его.. shopt -s nullglob; x=($'\x01'*); [[ -n $x ]] && { echo '\x01' is not suitable; exit; } –  Peter.O 03.09.2012, 12:13
  • 3
    YEEES! Спасибо Alan, я не думал о том точечном операторе, хотя я действительно знал, что сделать в человекочитаемых словах: "скажите/e не касаться материала вне ()" :) И благодаря Peter для удара приближаются также. Кроме того, если бы у меня была какая-либо идея того, как близко синтаксис PHP к Perl, я, вероятно, нашел бы решение методом проб и ошибок. Поскольку той точкой ЯВЛЯЕТСЯ JavaScript '+' дубликат в PHP для конкатенации строк. –  syntaxerror 03.09.2012, 13:37

предпочтенная острота, не намереваясь записать целый автономный сценарий только для этого

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

Для мелочи как это я обычно начинаю пытаться решить его в Bash:

#!/bin/bash
if [ -z "$1" ] ; then echo Need arguments. ; exit 1 ; fi

typeset -i i=1
for f in "$*"
do
    tailbits=`echo "$f" | sed -e 's/^[0-9]+//'`
    mv "$f" sertmp-`printf %02d $i`"$tailbits"
    i=i+1
done

for f in "sertmp-*"
do
    mv "$f" `echo "$f" | sed -e s/^sertmp-//` 
done

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

Это делает это на двух этапах, с sertmp- префиксы для первичной обработки для предотвращения любого риска коллизий имени. Если Вы называете этот сценарий mp3-renamer и назовите его как:

$ mp3-renamer 01-foo.mp3 03-bar.mp3 04-qux.mp3

Вы сталкиваетесь с тривиальной коллизией на первом, переименовывают, если Вы не используете 2 передачи, чтобы сделать переименование. (01-foo.mp3 -> 01-foo.mp3.)

Если Вы называете его как это, хотя:

$ mp3-renamer 02-foo.mp3 01-foo.mp3

Вы случайно стираетесь 01-foo.mp3 в первом переименовывают с 1 передачей, переименовывают.

Если бы проблема становится более сложной, я переписал бы ее в Perl. В той точке Вы могли затем использовать хеш, чтобы содержать старое-> новое отображение имени и использовать немного умного кода для разработки надлежащего порядка сделать переименования для предотвращения потребности в 2 передачах.

4
27.01.2020, 20:11

Теги

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