Đổi tên đệ quy tất cả các tệp trong thư mục bằng cách sử dụng đường dẫn tương đối được phân tách bằng dấu gạch dưới


0

Tôi có một cấu trúc thư mục như bên dưới nơi cấu trúc được biết đến và tên tệp lặp lại. Tôi muốn đổi tên các tệp sao cho chúng là duy nhất, sao cho

a/0/widgets/AL/part-1.gz trở thành

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

b/0/widgets/AL/part-1.gz trở thành

b/0/widgets/AL/b_0_widgets_AL_part-1.gz, Vân vân.

Bằng cách này, tôi có thể sao chép tất cả các tệp vào một thư mục cấp cao nhất trong khi vẫn giữ tất cả thông tin đã biết về tệp và không ghi đè bất kỳ tệp nào vì lặp lại tên tệp.

Gợi ý?

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

Câu trả lời:


1

Thử đi:

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

0

Tôi đã đưa ra giải pháp hacky này. Dễ dàng thực hiện bằng Python hơn 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]))                   
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.