Переименовать файлы в соответствии с родительской папкой [дубликат]

На этот вопрос уже есть ответ здесь:

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

Теперь я нашел несколько результатов, которые делают то, что я хочу, но все они, похоже, зависят от статического типа файла, пути, формата и т. Д.

Мне нужен тот, который берет любое безумное имя папки и применяет его к любым файлам внутри, не изменяя их расширение. Я не хочу, чтобы Parent's Parent's Parent и т. Д. Я мог запустить что-то в текущей папке, чтобы повлиять на все подпапки в этой папке.

Например:

Структура папки

This.Is.A.Crazy.Name.S00E00.720p
|
| asdfasdfasdfasdfasdfasdfafs.mkv
|
| info.nfo
|
| proof.jpg
|
You.See.Where.This.Is.Going.14x01.480p.crappo
|
| video.mp4

Ожидаемый результат

This.Is.A.Crazy.Name.S00E00.720p
|
|_This.Is.A.Crazy.Name.S00E00.720p.mkv
|
|_This.Is.A.Crazy.Name.S00E00.720p.nfo
|
|_This.Is.A.Crazy.Name.S00E00.720p.jpg
|
You.See.Where.This.Is.Going.14x01.480p.crappo
|
| You.See.Where.This.Is.Going.14x01.480p.crappo.mp4

Может ли кто-нибудь посоветовать, как это можно сделать в сценарии или одной длинной команде?

0
задан 7 February 2018 в 00:03

1 ответ

Можно использовать rename для этого:

rename -n 's/(.*)\/.*\./$1\/$1./' */*

Эта команда должна быть запущена в каталоге непосредственно выше каталогов, как которые Вы хотите обработать, точно в Вашем примере. Это сначала только перечислит изменения для Вас для проверки, если Вы будете довольны результатами, выполненными это без -n выполнить переименование.

Если существует несколько файлов с тем же расширением в одном каталоге, rename распечатает предупреждение для каждого файла и просто пропустит их. Вы могли вызвать перезапись с -f, но я высоко сомневаюсь, что это - то, что Вы хотите быть сделанными в них (редкий?) случаи.

Пример выполняется

$ tree
.
├── This.Is.A.Crazy.Name.S00E00.720p
│  ├── asdfasdfasdfasdfasdfasdfafs.mkv
│  ├── info.nfo
│  └── proof.jpg
└── You.See.Where.This.Is.Going.14x01.480p.crappo
    └── video.mp4
$ rename 's/(.*)\/.*\./$1\/$1./' */*
$ tree
.
├── This.Is.A.Crazy.Name.S00E00.720p
│  ├── This.Is.A.Crazy.Name.S00E00.720p.jpg
│  ├── This.Is.A.Crazy.Name.S00E00.720p.mkv
│  └── This.Is.A.Crazy.Name.S00E00.720p.nfo
└── You.See.Where.This.Is.Going.14x01.480p.crappo
    └── You.See.Where.This.Is.Going.14x01.480p.crappo.mp4

Объяснение

rename 's/(.*)\/.*\./$1\/$1./' */*
  • s/a/b/sзамена a b
  • (.*)\/.*\. – возьмите все до (excl). последняя наклонная черта, сохраняющая его как группа 1 и, берет наклонную черту и все до (incl). последняя точка
    и замените им
  • $1\/$1. – группа 1 (имя dir), наклонная черта, группа 1 снова (имя файла) и точка (точка перед расширением, которое самим не стало затронутым),
3
ответ дан 31 October 2019 в 01:41

Другие вопросы по тегам:

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