使用下划线分隔的相对路径递归重命名目录中的所有文件

使用下划线分隔的相对路径递归重命名目录中的所有文件

我有一个如下所示的目录结构,其中结构已知,文件名重复。我想重命名文件,使它们唯一,以便

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, ETC。

这样,我可以将所有文件复制到一个顶级目录中,同时保留有关该文件的所有已知信息,并且不会因为文件名重复而破坏任何文件。

有什么建议吗?

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

答案1

尝试这个:

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

答案2

我想到了一个巧妙的解决方案。在我看来,用 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]))                   

相关内容