Hợp nhất và viết thường Thư mục và FIles


1

Tôi có một thư mục như thế này

root/A/b/SomeFile.jpg
root/A/B/OtherFIle.jpg
root/a/D/yet_again.jpg

Và tôi muốn điều này

root/a/b/somefile.jpg
root/a/b/otherfile.jpg
root/a/d/yet_again.jpg

HOẶC LÀ

other_root/a/b ...

Tôi rất vui khi cho rằng không có va chạm.

Làm thế nào tôi có thể làm điều này trong một tập lệnh bash hoặc python (hoặc một cái gì đó được dựng sẵn để sắp xếp các tập tin và thư mục)?

Tôi sẽ làm bằng tay, nhưng có hàng ngàn người trong số họ.

Câu trả lời:


1

Giải pháp zsh bắt buộc:

for x in root/**/*(On); do mv -i $x ${x:h}/${x:t:l}; done

Điều này sẽ yêu cầu xác nhận trong trường hợp va chạm.

Giải thích: **có nghĩa là tất cả các thư mục (phụ) *, đệ quy. (On)sắp xếp theo thứ tự từ điển giảm dần, để các thư mục luôn bật lên sau nội dung của chúng. ${x:h}có nghĩa là một phần tên thư mục của $x, ${x:t}có nghĩa là tên cơ sở của nó và :lchuyển đổi thành chữ thường.

Bash 4 có thể làm được, vì nó có **, nhưng tôi không biết nó có tương đương không (On).


Wow, mát mẻ một- (ish) lót. Nhưng hai (hoặc một rưỡi) vấn đề. 1) OP cũng muốn bình thường hóa tên dir. Tôi không biết zsh nhưng tôi giả sử: mv -i $x ${x:h:l}/${x:t:l}sẽ làm việc. Và tại thời điểm này, bạn có thể cần phải tạo các thư mục con. [ ! -d ${x:h:l} ] && mkdir -p ${x:h:l}
Rich Homolka

@Rich: cũng **/*(On)khớp với các thư mục, vì vậy chúng sẽ bị giảm. Và bởi vì (On), các thư mục được chuyển xuống sau nội dung của chúng, đó là lý do tại sao mvlệnh cẩn thận không viết thường phần thư mục.
Gilles

0

Đây là một cách rất cụ thể, không chung chung để giải quyết vấn đề này, mà tôi gọi là 'lực lượng vũ phu' là tốt nhất.

import os
import re
import shutil

path = os.getcwd()
newpath = os.path.join(path,'..','newpics')
for item in os.listdir(path):
    path1 = os.path.join(path,item)
    if os.path.isdir(path1):
        for item_2 in os.listdir(path1):
            path2 = os.path.join(path1,item_2)
            for item_3 in os.listdir(path2):
                path3 = os.path.join(path2,item_3)
                item_lc = item.lower()
                item_2lc = item_2.lower()
                item_3lc = item_3.lower()
                pic_path = os.path.join(newpath,item_lc,item_2lc,item_3lc)
                print os.path.join(path,item,item_2,item_3)
                print pic_path
                try:
                    os.makedirs(os.path.join(newpath,item_lc,item_2lc))
                except OSError:
                    pass
                shutil.copyfile(path3,pic_path)
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.