Renomeie os arquivos para corresponder à pasta pai [duplicada]

0

Eu quero renomear todos os arquivos dentro de um diretório para corresponder ao nome da pasta pai.

Agora, encontrei vários resultados que fazem o que eu quero, mas todos parecem depender de um tipo de arquivo estático, caminho, formato etc.

Eu preciso de um que pegue qualquer nome de pasta maluco e o aplique a todos os arquivos, deixando sua extensão inalterada. Eu não quero o Parent's Parent's Parent, etc. Apenas algo que eu possa executar em uma pasta atual para afetar todas as sub-pastas dentro dessa pasta.

Por exemplo:

Estrutura de pastas

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

Resultado esperado

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

Alguém poderia aconselhar como isso pode ser feito em um script ou em um único comando longo?

    
por DGC 07.02.2018 / 07:04

1 resposta

3

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 ubstitute a por b
  • (.*)\/.*\. - 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)
por dessert 07.02.2018 / 07:55