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

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

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, и доступен только терминал.

Если кто может мне с этим помочь, буду очень признателен :).

1
задан 30 June 2019 в 14:24

3 ответа

См. дублирующий вопрос для общего подхода. Очевидно, что вам нужно адаптироваться к вашим конкретным требованиям:

  • Для параметров 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/' {} +
1
ответ дан 30 June 2019 в 14:24

Можно использовать 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
3
ответ дан 30 June 2019 в 14:24

Если в вашей системе нет rename (или неправильно rename 1 ), то вы можете легко выполнить этот конкретный вид замены с расширением параметра оболочки ${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, как только вы почувствуете, что он поступает правильно.

  1. Что со всеми переименованиями: prename, rename, file-rename?
2
ответ дан 30 June 2019 в 14:24

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

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