На этот вопрос уже есть ответ здесь:
Я хочу переименовать все файлы в каталоге, чтобы они соответствовали имени родительской папки.
Теперь я нашел несколько результатов, которые делают то, что я хочу, но все они, похоже, зависят от статического типа файла, пути, формата и т. Д.
Мне нужен тот, который берет любое безумное имя папки и применяет его к любым файлам внутри, не изменяя их расширение. Я не хочу, чтобы 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
Может ли кто-нибудь посоветовать, как это можно сделать в сценарии или одной длинной команде?
Можно использовать 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 снова (имя файла) и точка (точка перед расширением, которое самим не стало затронутым),