Skrip python di bawah ini berfungsi. File tersembunyi disimpan secara terpisah di folder, serta file tanpa ekstensi.
Karena mungkin digunakan untuk tujuan yang lebih luas, saya menambahkan beberapa opsi:
- Anda dapat mengatur ekstensi yang ingin Anda kecualikan dari "reorganisasi". Jika Anda hanya ingin memindahkan semua, atur
exclude = ()
- Anda dapat memilih apa yang harus dilakukan dengan folder kosong (
remove_emptyfolders = True
atau False
)
- Jika Anda ingin menyalin file daripada memindahkannya , ganti baris:
shutil.move(subject, new_dir+"/"+name)
oleh:
shutil.copy(subject, new_dir+"/"+name)
Naskah:
#!/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()
JIKA ada risiko menimpa file duplikat yang tidak diinginkan
Dengan mengorbankan beberapa baris tambahan, kami dapat mencegah menimpa duplikat yang mungkin. Dengan kode di bawah ini, duplikat akan diubah namanya menjadi:
duplicate_1_filename, duplicate_2_filename
dll.
Naskah:
#!/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()
EDIT
Dengan mengingat OP, kita semua lupa menambahkan instruksi tentang cara menggunakan. Karena pertanyaan duplikat mungkin ( dan memang ) muncul, itu mungkin berguna.
Cara Penggunaan
- Salin salah satu skrip ke file kosong, simpan sebagai
reorganize.py
Di bagian kepala skrip, setel direktori yang ditargetkan (dengan file untuk ditata ulang):
reorg_dir = "/path/to/directory_to_reorganize"
(gunakan tanda kutip jika direktori berisi spasi)
kemungkinan ekstensi yang ingin Anda kecualikan (mungkin tidak ada, seperti di bawah):
exclude = ()
dan jika Anda ingin menghapus folder kosong sesudahnya:
remove_emptyfolders = True
Jalankan skrip dengan perintah:
python3 /path/to/reorganize.py
NB jika Anda ingin menyalin file daripada memindahkan , ganti:
shutil.move(subject, new_dir+"/"+name)
oleh:
shutil.copy(subject, new_dir+"/"+name)
Silakan coba dulu pada sampel kecil.
-iname '*.*'
harus mengurus kasus sudut saya khawatir tentang ... ide bagus!*.fig.bak
atau.profile/.bashrc
yang, tetapi seharusnya hanya menangani file dengan ekstensi, setidaknya. Terima kasih.Menghitung daftar ekstensi (setelah pindah):
Menghitung daftar ekstensi (sebelum pindah):
(dalam contoh terakhir ini, kami menghitung jumlah file untuk setiap ekstensi dan mengurutkannya)
sumber
ls -X | grep -Po '(?<=\.)(\w+)$'
adalah ide pertama saya untuk mendapatkan daftar ekstensi yang diurutkan. Apakah ini sangat buruk? Apa yang Anda sarankan?ls -X
. Mengenai mengapa saya merekomendasikan melawanls
, lihat unix.stackexchange.com/q/128985/70524 dan unix.stackexchange.com/q/112125/70524 . Untuk mencapai apa yang Anda lakukan, saya akan menempuh jalan yang lebih panjang:find . -type f -name '*?.?*' -print0 | sed -z 's/.*\.//' | sort -zu
(dengan opsional| uniq -cz
, jika jumlah diperlukan). Danfind ... -print0 | gawk -v RS='\0'
(meskipun itu tidak terlalu portabel ) untuk yang pertama.Coba skrip shell ini.
sumber
filepath
denganfile
. Saya akan memperbaikinya secara langsung.for file in "$src"/*?.?*; do ..
read
mungkin memiliki perilaku yang tidak terduga. Anda juga harus mengutip variabel dalam perintah mkdir dan mv.for i in *; do printf "%s\n" "$i"; done; for i in $(ls -d); do printf "%s\n" "$i"; done
Jika Anda memiliki nama ren / prename Perl yang diinstal:
sumber