На этот вопрос уже есть ответ здесь:
I ' m в настоящее время находится в ситуации, когда мне нужно переименовать кучу файлов в разных папках с одинаковым расширением (SRT).
В настоящее время мой каталог «setup» выглядит следующим образом:
This is a folder (2000)
- This.is.a.folder.2000
- This.is.a.folder.2000.wmv
- This.is.a.folder.2000.txt
- This.is.a.folder.2000.srt
This is also a folder (2001)
- This.is.also.a.folder.2001
- This.is.also.a.folder.2001.wmv
- This.is.also.a.folder.2001.txt
- This.is.also.a.folder.2001.srt
И мне нужно переименовать файлы SRT, чтобы они выглядели так:
This is a folder (2000)
- This.is.a.folder.2000
- This.is.a.folder.2000.wmv
- This.is.a.folder.2000.txt
- This.is.a.folder.2000.en.srt
This is also a folder (2001)
- This.is.also.a.folder.2001
- This.is.also.a.folder.2001.wmv
- This.is.also.a.folder.2001.txt
- This.is.also.a.folder.2001.en.srt
Есть ли способ сделать это? Я использую сервер Ubuntu, и доступен только терминал.
Если кто может мне с этим помочь, буду очень признателен :).
См. дублирующий вопрос для общего подхода. Очевидно, что вам нужно адаптироваться к вашим конкретным требованиям:
rename
вы можете указать 's/\.srt/\.en\.srt/'
, который будет искать .srt
и изменяться на .en.srt
. .srt
. файлы. Для этого добавьте опцию -name '*.srt'
к команде поиска. -n
к команде переименования. Это показывает, как переименования будут выполняться без их фактического выполнения. Если все выглядит нормально, повторите команду без опции -n
. Команда, основанная на посте, который также задавал подобный вопрос, будет выглядеть как
find /path/to/parrent-dir -type f -name '*.srt' -exec rename -n 's/\.srt/.en.srt/' {} +
Можно использовать bash
globstar
опция, включенная с shopt -s globstar
:
Если установлено, шаблон
**
используемый в контексте расширения пути будет соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов.
printf '%s\0' **/*.srt | xargs -0 rename 's/srt$/en.$&/'
Это создает разграниченный нулем список из каждого соответствия файла *.srt
в или под текущим каталогом и каналами это к xargs
который работает rename
так же часто по мере необходимости. rename
выражение заменяет финалом “srt” с “en”. сопровождаемый совпавшей строкой ($&
).
$ tree
.
├── 1
│ └── test.srt
├── 2
│ └── 3
│ └── test.srt
├── srt.srt
└── test.srt
$ shopt -s globstar
$ printf '%s\0' **/*.srt | xargs -0 rename 's/srt$/en.$&/'
$ tree
.
├── 1
│ └── test.en.srt
├── 2
│ └── 3
│ └── test.en.srt
├── srt.en.srt
└── test.en.srt
Если в вашей системе нет rename
(или неправильно rename
1 sup>), то вы можете легко выполнить этот конкретный вид замены с расширением параметра оболочки ${f%.srt}
для удаления завершающий .srt
из $f
:
find path/to/dir -name '*.srt' -execdir sh -c '
for f; do echo mv "$f" "${f%.srt}.en.srt"; done
' sh {} +
Удалите echo
, как только вы почувствуете, что он поступает правильно.