переименовать инструмент Perl: не может переименовать, нет такого файла или каталога - PullRequest
0 голосов
/ 19 октября 2019

Я использую инструмент переименования Perl для написания bash-скрипта, который ищет любые файлы в пути, в которых есть пробелы (он делает другие вещи, но старается сохранить это простым). Я использую переключатель -c для преобразования в нижний регистр и регулярное выражение для замены всех пробелов на тире. Команда завершается без ошибок.

rename -f -X -c 's/[ ]+/-/g' /Volumes/data/Users-Links/adrz/test-site/with\ spaces/*

Приведенное выше преобразовывает файлы в нижний регистр, но не заменяет пробелы тире. Затем я попытался с ключом -e перед выражением.

rename -f -X -c -e 's/[ ]/-/g' /Volumes/data/Users-Links/adrz/test-site/with\ spaces/*

и получил ...

Can't rename '/ Volumes/ data / Users-Links / adrz / тест-сайт / с пробелами / hello world.txt 'to' / объемы / данные / пользователи-ссылки / adrz / тест-сайт / с пробелами / hello world.txt ': нет такогофайл или каталог

Кажется, он действует на имя каталога, в котором есть пробелы, а также на файлы внутри каталога. Отметим, что если в пути нет пробелов, он работает нормально.

Я пробовал:

  • Использование двойных кавычек, одинарных кавычек и / для экранирования пробелов в пути.
  • Я пытался использовать команды Subst и Subs-all с одинаковыми ошибками

Я искал несколько недель и не могу разобраться. Это ошибка в инструменте или в моем уме?

Спасибо.

1 Ответ

2 голосов
/ 19 октября 2019

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

  1. Запустите rename из каталога, в котором находятся файлы.

    sh -c 'cd /Volumes/.../with\ spaces; rename -f -X -c -e "s/[ ]+/-/g" *'
    
  2. Соответствовать только пробелам, за которыми не следует косая черта (/).

    rename -f -X -c -e 's{[ ]+(?!.*/)}{-}sg' /Volumes/.../with\ spaces/*
    
  3. Разбить путь на его компонентыи работают только с частью имени файла.

    rename -f -X -c -e '
       use Basename qw( dirname basename );
       $_ = dirname($_) . "/" . basename($_) =~ s/[ ]+/-/gr;
    ' /Volumes/.../with\ spaces/*
    

    Это избыточно в этой ситуации, но может быть полезно в ситуациях, когда простое изменение (как в # 2) невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...