Использование переименования для рекурсивного изменения префикса файлов в Ubuntu (регулярное выражение не работает) - PullRequest
0 голосов
/ 14 января 2019

Я использую rename доступно в Ubuntu:

$ rename --version
/usr/bin/rename using File::Rename version 0.20

Вот так выглядит мой каталог:

$ tree .
.
├── awp-3
├── bar
│   └── wp-2
└── wp-foo
    └── wp-1

Моя цель - переименовать все файлы и папки с префиксом wp- в static-

Вот что я бежал:

$ shopt -s globstar

$ rename -n 's/wp-/static-/' **
rename(awp-3, astatic-3)
rename(bar/wp-2, bar/static-2)
rename(wp-foo, static-foo)
rename(wp-foo/wp-1, static-foo/wp-1)

Это почти , что я хочу. Файл awp-3 не должен был быть переименован.

Так что я сделал это вместо:

$ rename -n 's/^wp-/static-/' **
rename(wp-foo, static-foo)
rename(wp-foo/wp-1, static-foo/wp-1)

По какой-то причине это не изменило имя файла wp-1 или wp-2.

Как я могу использовать переименование, чтобы изменить wp-2, wp-foo и wp-1 на static - *?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Рекурсивное переименование файлов с использованием rename проблематично: перед тем, как переименовать родительские каталоги, необходимо сначала переименовать внутренние файлы / подкаталоги. Простое добавление модификатора /g для переименования всех уровней (например, s!(^|/)wp-!$1static-!g для переименования (wp-foo/wp-1, static-foo/static-1) не будет работать.

Лучше использовать инструмент, поддерживающий рекурсивные операции, например perlmv . Я предлагаю инструмент на основе Perl, потому что переименование также является инструментом на основе Perl, и они работают аналогично. К сожалению, пока нет пакета Debian / Ubuntu для perlmv, поэтому вам нужно установить его через клиент CPAN (например, cpanm -n App::perlmv). Когда у вас есть perlmv:

% perlmv -R -de 's/^wp-/static-/' *

Результат:

% tree .
.
├── awp-3
├── bar
│   └── static-2
└── static-foo
    └── static-1

Примечания:

  • вам не нужно использовать ** с perlmv, просто *.

  • -R для рекурсии.

  • Режим пробега в perlmv равен -d, а не -n. Как только вы увидите, что perlmv будет делать то, что вы хотите, вы можете опустить -d или заменить его на -v (подробный).

  • вам нужно добавить -e перед указанием кода Perl.

0 голосов
/ 14 января 2019

Якорь ^ соответствует только началу строки. Я предполагаю, что вы хотите

rename -n 's%(^|/)wp-%$1static-%' **

Еще один способ усилить это - сказать, что wp должно встречаться только рядом с границей слова.

rename -n 's/\bwp-/static-/' **
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...