我有一个如下所示的目录结构,其中结构已知,文件名重复。我想重命名文件,使它们唯一,以便
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]))