Переименовать файл с помощью 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