Renomeia recursivamente todos os arquivos no diretório usando o caminho relativo separado por sublinhados

0

Eu tenho uma estrutura de diretórios como abaixo, onde a estrutura é conhecida, e os nomes dos arquivos repita-se. Eu quero renomear os arquivos para que eles sejam únicos, para que

a/0/widgets/AL/part-1.gz torna-se

a/0/widgets/AL/a_0_widgets_AL_part-1.gz ,

e

b/0/widgets/AL/part-1.gz torna-se

b/0/widgets/AL/b_0_widgets_AL_part-1.gz , etc.

Dessa forma, eu posso copiar todos os arquivos em um diretório de nível superior, mantendo todas as informações conhecidas sobre o arquivo e não prejudicando nenhum arquivo por causa das repetições do nome do arquivo.

Sugestões?

├── a
│   ├── 0
│   │   └── widgets
│   │       ├── AL
│   │       │   ├── part-1.gz
│   │       │   └── part-2.gz
│   │       ├── AK
│   │       │   ├── part-3.gz
│   │       │   └── part-4.gz
| ....

├── b
│   ├── 0
│   │   └── widgets
│   │       ├── AL
│   │       │   ├── part-1.gz
│   │       │   └── part-2.gz
│   │       ├── AK
│   │       │   ├── part-3.gz
│   │       │   └── part-4.gz
| ....
    
por Idr 13.09.2012 / 00:18

2 respostas

0

Eu criei esta solução hacky. Mais fácil de fazer em Python do que Bash IMHO.

#!/usr/bin/env python                                               

import os                                                           

for root, dirs, files in os.walk('/mnt/orig_data'):            
    if len(files) > 0:                                              
        for file in files:                                          
            parts = root.split('/')                                 
            new_file = '%s_%s' % ('_'.join(parts[-4:]), file, )     
            os.rename('/'.join([root, file]),                       
                  '/'.join([root, new_file]))                   
    
por 13.09.2012 / 20:58
1

Tente isto:

find . -type f -print | while read path; do
  dir="$(dirname "$path")"
  prefix="${dir:2}"
  prefix="${prefix//\//_}"
  mv "$path" "$dir/${prefix}_$(basename "$path")"
done
    
por 13.09.2012 / 00:49