perl `rename `скрипт не работает в некоторых случаях?

Как насчет

awk '/#Match/,EOF {if (/^---/) next} 1' file

Начиная со строки, соответствующей #Match, пока переменная EOFне станет истинной (, чего никогда не произойдет, поэтому = конец входного потока ), пропустить фактическую строку, если она соответствует трем (или больше )тире в начале.

4
01.01.2021, 17:41
1 ответ

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

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

find. -type f -execdir rename -v 'tr/ /_/' -- {} \;

Предикат -execdirне является стандартом -, но обычно используется. С -execdirвместо -execэто выполняет команду с каталогом, в котором файл был найден, в качестве текущего каталога. Таким образом, утилита renameникогда не увидит имена родительских каталогов файла.

Я использовал здесь --для защиты от случая, когда мы пытаемся переименовать файл с именем, начинающимся с дефиса (см. Что означает " --" (double -тире )означает?). Это не будет проблемой с GNU find, так как имена файлов будут иметь префикс ./, но этого не происходит, по крайней мере, в некоторых реализациях findв системах BSD.

Другим вариантом является использование опций -d, --filename, --nopathили --nofullpathутилиты rename(, все они одинаковы):

find. -type f -exec rename -d -v 'tr/ /_/' {} \;

Это останавливает утилиту от рассмотрения чего-либо, кроме части имени файла любого заданного аргумента имени пути.

Я позволил себе изменить Perl-выражение с команды s///на команду tr///, поскольку выполняемое нами преобразование представляет собой простую транслитерацию, а не общую замену.

Вы также можете запускать renameтолько для имен файлов, содержащих пробелы. Выберите их с помощью теста -name '* *'перед -execили -execdir.

6
18.03.2021, 22:39

Теги

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