Переименовать файл с помощью zmv

Я только что открыл змв этим утром.

Чтобы проверить это, я создал несколько файлов.

test1.txt test2.txt test3.txt

Я пытаюсь переименовать их с помощью zmv. Я хотел бы получить такой вывод:

test-1.txt test-2.txt test-3.txt

когда я пытаюсь использовать символы подстановки, я получаю сообщение об ошибке:

zmv '(*)([0-9]{1,})(.txt)' '$1-$2$3'
zmv: error: number of wildcards in each pattern must match

Я делаю что-то не так (ответ должен быть да:))

4 ответа

Вы только хотите добавить - к имени файла? Попробуйте это так:

zmv -n 'test(*).txt' 'test-${1}.txt'

-n Переключатель показывает вам, что произойдет, не выполняя никаких действий.

Это чрезвычайно запоздалый ответ, так как я столкнулся с этой проблемой и ломал голову над ней. Я наконец понял, что слой настройки zsh, который я использовал (yadr), был псевдонимом zmv. alias zmv="noglob zmv -W", Я верю, что даже популярный слой oh-my-zsh делает это.

Проверьте, есть ли у вашего zmv псевдоним. Если так unalias это с помощью unalias zmv и это ужасно number of wildcards must match ошибка должна исчезнуть сейчас

Если первый аргумент должен быть регулярным выражением, возможно, проблема в том, что вы использовали * вместо .*, (* является оператором 0 или более, . соответствует любому отдельному символу).

Таким образом, первое слово, вероятно, было воспринято буквально как аргумент * оператор, вместо открытия группы захвата.

Попробуйте http://www.regexr.com/ для интерактивного учебника регулярных выражений / тестер / строитель.

Еще один очень поздний ответ, но поскольку ни один из приведенных выше ответов, похоже, не ответил на мой вопрос, вот ответ (с использованием zsh 5.8).

      ❯ ls
test1.txt  test2.txt  test3.txt

Если я попытаюсь запустить вашу команду, я получу другую ошибку. Не уверен, что это гораздо более новая версия zsh или ваша проблема связана с псевдонимом, как предложено выше.

      ❯ zmv -n '(*)([0-9]{1,})(.txt)' '$1-$2$3'
zmv:239: no matches found: (*)([0-9]{1,})(.txt)

Проблема в том,{1,}. Я не уверен, какую проблему вы пытаетесь решить с помощью этого?

Если вы хотите сопоставлять файлы только с одной цифрой, вы можете сделать это (-nпоказывает, что он будет делать, фактически ничего не меняя):

      ❯ zmv -n '(*)([0-9])(.txt)' '$1-$2$3'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt

Если вы хотите сопоставить одну или несколько цифр, вы можете сделать это:

      > zmv -n '(*)([0-9]*)(.txt)' '$1-$2$3'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt

Лично я бы написал так, потому что считаю, что так понятнее:

      ❯ zmv -n '(*)([0-9].txt)' '$1-$2'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt

Или самый простой и очевидный из всех:

      ❯ zmv -n 'test(*).txt' 'test-$1.txt'
mv -- test1.txt test-1.txt
mv -- test2.txt test-2.txt
mv -- test3.txt test-3.txt
Другие вопросы по тегам