У меня есть структура каталогов, как показано ниже, где структура известна, а имена файлов повторяются. Я хочу переименовать файлы, чтобы они были уникальными, чтобы

a/0/widgets/AL/part-1.gz становится

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

а также

b/0/widgets/AL/part-1.gz становится

b/0/widgets/AL/b_0_widgets_AL_part-1.gz и т. д.

Таким образом, я могу скопировать все файлы в один каталог верхнего уровня, сохраняя при этом всю известную информацию о файле и не забивая никакие файлы из-за повторения имени файла.

Предложения?

├── 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
| ....

2 ответа2

1

Попробуй это:

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

Я придумал это хакерское решение. Проще сделать в Python, чем Bash ИМХО.

#!/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]))                   

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .