Você pode usar rename
para isso:
rename -n 's/(.*)\/.*\./$1\/$1./' */*
Este comando precisa ser iniciado no diretório diretamente acima dos diretórios que você deseja processar, exatamente como no seu exemplo. Primeiro, apenas lista as alterações para você verificar, se você estiver satisfeito com os resultados, execute-o sem -n
para realizar a renomeação.
Se houver vários arquivos com a mesma extensão em um diretório, rename
imprimirá um aviso para cada arquivo e os deixará de fora. Você pode forçar a sobrescrever com -f
, mas duvido que seja o que você quer que seja feito nesses casos (raros?).
Exemplo de execução
$ 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
Explicação
rename 's/(.*)\/.*\./$1\/$1./' */*
-
s/a/b/
-s
ubstitutea
porb
-
(.*)\/.*\.
- pegue tudo até (excl.) a última barra salvando como grupo 1 e pegue a barra e tudo até (incl.) o último ponto e e substitua por -
$1\/$1.
- grupo 1 (nome dir), uma barra, grupo 1 novamente (nome do arquivo) e um ponto (ponto antes da extensão, que por si só não foi tocado)