У меня есть папка с несколькими подпапками, внутри которой у меня есть файл с одинаковым именем во всех подпапках. Например:
abc/def_0/ghi.jpg
abc/def_5/ghi.jpg
abc/def_10/ghi.jpg
abc/pqr_0/ghi.jpg
abc/pqr_5/ghi.jpg
abc/pqr_10/ghi.jpg
Я хотел бы переименовать этот конкретный файл (ghi.jpg
) во всех подразделах папки как:
abc/def_0/def_xyz_0.jpg
abc/def_5/def_xyz_5.jpg
abc/def_10/def_xyz_10.jpg
abc/pqr_0/pqr_xyz_0.jpg
abc/pqr_5/pqr_xyz_5.jpg
abc/pqr_10/pqr_xyz_10.jpg
Я был бы признателен за любую помощь, так как я не смог найти решение для этого , Спасибо!
Для этого вы можете использовать file-rename
. Если вы не знакомы с этим инструментом, я рекомендую запустить file-rename --version
, чтобы проверить, есть ли он у вас - любой вывод, кроме ошибки, означает, что вы это делаете. Некоторые выпуски Ubuntu не поставляются с ним по умолчанию, поэтому у вас может не быть его, и в этом случае вы можете получить его, установив пакет rename
. (Ошибка «команда не найдена», если у вас ее нет, скорее всего, даже расскажет вам об этом.)
cd
в каталог abc
, подкаталоги которого содержат файлы, которые вы хотите переименовать и запустить этот. Затем, если показанные операции переименования действительно те, которые вы хотите, запустите его снова без -n
, чтобы выполнить фактическое переименование.
file-rename -n 's|^(.+)_(\d+)/ghi\.jpg$|$1_$2/$1_xyz_$2.jpg|' */ghi.jpg
Генерирует список файлов для переименования, используя глобул оболочки, и передает его в качестве аргументов file-rename
для переименования. Предполагается, что вы хотите:
ghi.jpg
, которые находятся непосредственно в подкаталогах с именами, заканчивающимися на _
, за которыми следуют цифры, каталога abc
. xyz
, после завершающего подчеркивания и цифр из имени содержащего каталога. Способ, который работает, заключается в том, что s|pattern|substitution|
работает с файлами, пути которых, поскольку они были переданы в качестве аргументов в file-rename
, соответствуют pattern
(интерпретируется как регулярное выражение в диалекте Perl ). Операция, которую он выполняет, состоит в том, чтобы переименовать их, используя указанные substitution
. Файлы, имена которых не соответствуют pattern
, не будут переименованы. В |
нет ничего особенного в качестве выбора разделителя; Я просто не хочу использовать обычный /
, так как он появляется в путях.
В шаблоне ^(.+)_(\d+)/ghi\.jpg$
:
^
соответствует началу пути, а $
соответствует концу. Это позволяет сопоставлять только все пути, которые были переданы, а не любую его часть.
(Для устранения одной возможной путаницы: проходящие пути все еще являются относительными путями , такими как def_0/ghi.jpg
, а не абсолютными путями, такими как /home/you/abc/def_0/ghi.jpg
. Когда люди говорят о «полных путях», они обычно означают абсолютные пути. Под «полнотой пути» я подразумеваю каждый передаваемый аргумент, а не его меньшую подстроку.)
(.+)
совпадает, а захватывает ( (
)
) последовательность из одного или более ( +
) любого символа ( .
). Это входит в первую группу захвата.
_
соответствует самому себе, буквальный символ подчеркивания.
(\d+)
соответствует и захватывает ( (
)
) последовательность из одной или нескольких ( +
) цифр ( \d
). Это входит во вторую группу захвата.
/
соответствует самому себе, символ буквального слеша. (Он не ведет себя как разделитель, потому что вместо него мы использовали |
в качестве разделителя.)
ghi
соответствует буквальному тексту ghi
.
\.
соответствует просто символу .
. \
избегает .
; в противном случае .
будет означать «любой символ».
jpg
соответствует буквальному тексту jpg
.
Подстановка $1_$2/$1_xyz_$2.jpg
означает:
$1
). Это текст, который соответствует .+
в шаблоне. _
. $2
). Это текст, который соответствует \d+
в шаблоне. /
. $1
) снова. _xyz_
. $2
) снова. .
. В отличие от шаблонов, в подстановках a .
специально не обрабатывается, поэтому его не нужно (и не следует) экранировать с помощью \
. jpg
. Для общей документации по использованию file-rename
см. Выходные данные file-rename --help
, man file-rename
и этого сообщения в блоге . (Я использую file-rename
вместо команды rename
, потому что в некоторых системах rename
- это другая утилита. В большинстве они одинаковы.)