есть ли что-то вроде расширения скобок при использовании perl rename?

У меня есть сотни файлов, из которых я хочу удалить начальные числа. Файлы названы примерно так, как показано ниже:

048banana.txt  
049pear.txt     
050watermelon.txt  
051tomato.txt    
062pepper.txt  
053potato.txt 

мой переход к однострочному списку в этой ситуации будет следующим:

rename 's/048|049|050|051|052|053//g' *

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

rename 's\{048..053}\\g' *
0
задан 28 July 2020 в 19:45

1 ответ

Ближайшим эквивалентом в perl, вероятно, будет оператор диапазона ..

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

$ rename -n 'our $re; BEGIN{$re = join "|", ("048".."053")} s/^$re//' *.txt
rename(048banana.txt, banana.txt)
rename(049pear.txt, pear.txt)
rename(050watermelon.txt, watermelon.txt)
rename(051tomato.txt, tomato.txt)
rename(053potato.txt, potato.txt)

Кавычки вокруг «048» и «053» необходимы для предотвращения принудительной интерпретации начальных нулей как восьмеричных последовательностей.

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

$ rename -n 's/^\d{3}//' {048..053}*.txt
rename(048banana.txt, banana.txt)
rename(049pear.txt, pear.txt)
rename(050watermelon.txt, watermelon.txt)
rename(051tomato.txt, tomato.txt)
rename(052*.txt, *.txt)
rename(053potato.txt, potato.txt)

Модификатор g не требуется в любом случае, поскольку для каждого имени файла существует только одна замена.

Обратите внимание, что расширение скобок оболочки попытается переименовать 052 * .txt , поскольку вы, очевидно, неt иметь совпадающее имя файла с префиксом 052 - вы можете предотвратить это, установив shopt -s nullglob перед запуском команды.

0
ответ дан 2 August 2020 в 22:03

Другие вопросы по тегам:

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