Kịch bản python dưới đây thực hiện công việc. Các tệp ẩn được lưu trữ riêng trong một thư mục, cũng như các tệp không có phần mở rộng.
Vì nó có thể được sử dụng cho nhiều mục đích hơn, tôi đã thêm một vài tùy chọn:
- Bạn có thể đặt tiện ích mở rộng mà bạn muốn loại trừ khỏi "sắp xếp lại". Nếu bạn chỉ muốn di chuyển tất cả, hãy đặt
exclude = ()
- Bạn có thể chọn làm gì với các thư mục trống (
remove_emptyfolders = True
hoặc False
)
- Trong trường hợp bạn muốn sao chép các tệp thay vì di chuyển chúng, hãy thay thế dòng:
shutil.move(subject, new_dir+"/"+name)
bởi:
shutil.copy(subject, new_dir+"/"+name)
Kịch bản:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
shutil.move(subject, new_dir+"/"+name)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
NẾU có nguy cơ ghi đè lên các tệp trùng lặp không mong muốn
Với chi phí của một vài dòng bổ sung, chúng tôi có thể ngăn chặn việc ghi đè lên các bản sao có thể. Với mã bên dưới, các bản sao sẽ được đổi tên thành:
duplicate_1_filename, duplicate_2_filename
Vân vân.
Kịch bản:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
n = 1; name_orig = name
while os.path.exists(new_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
newfile = new_dir+"/"+name
shutil.move(subject, newfile)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
BIÊN TẬP
Với OP trong tâm trí, tất cả chúng ta đều quên thêm một hướng dẫn về cách sử dụng. Vì các câu hỏi trùng lặp có thể ( và làm ) xuất hiện, tuy nhiên nó có thể hữu ích.
Cách sử dụng
- Sao chép một trong các tập lệnh vào một tệp trống, lưu nó dưới dạng
reorganize.py
Trong phần đầu của tập lệnh, đặt thư mục được nhắm mục tiêu (với các tệp để sắp xếp lại):
reorg_dir = "/path/to/directory_to_reorganize"
(sử dụng dấu ngoặc kép nếu thư mục chứa dấu cách)
các tiện ích mở rộng có thể bạn muốn loại trừ (có thể không có, như bên dưới):
exclude = ()
và nếu bạn muốn xóa các thư mục trống sau đó:
remove_emptyfolders = True
Chạy đoạn script với lệnh:
python3 /path/to/reorganize.py
NB nếu bạn muốn sao chép các tập tin thay vì di chuyển , thay thế:
shutil.move(subject, new_dir+"/"+name)
bởi:
shutil.copy(subject, new_dir+"/"+name)
Vui lòng thử đầu tiên trên một mẫu nhỏ.
-iname '*.*'
nên chăm sóc các trường hợp góc Tôi đã lo lắng về ... ý tưởng tốt đẹp!