Как насчет
awk '/#Match/,EOF {if (/^---/) next} 1' file
Начиная со строки, соответствующей #Match
, пока переменная EOF
не станет истинной (, чего никогда не произойдет, поэтому = конец входного потока ), пропустить фактическую строку, если она соответствует трем (или больше )тире в начале.
Вы пытаетесь запустить 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
.