Aşağıdaki python betiği işi yapar. Gizli dosyalar, bir klasörde ve uzantısız dosyalarda ayrı olarak saklanır.
Çok çeşitli amaçlar için kullanılabileceğinden, birkaç seçenek ekledim:
- "Yeniden düzenleme" dışında bırakmak istediğiniz uzantıları ayarlayabilirsiniz. Sadece hepsini taşımak istiyorsanız,
exclude = ()
- Boş klasörlerle (
remove_emptyfolders = True
veya False
) ne yapılacağını seçebilirsiniz
- Dosyaları taşımak yerine kopyalamak istiyorsanız , satırı değiştirin:
shutil.move(subject, new_dir+"/"+name)
tarafından:
shutil.copy(subject, new_dir+"/"+name)
Senaryo:
#!/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()
Yinelenen yinelenen dosyaların üzerine yazma riski varsa
Birkaç ekstra satır pahasına, olası kopyaların üzerine yazılmasını önleyebiliriz. Aşağıdaki kodla, kopyalar şu şekilde yeniden adlandırılacaktır:
duplicate_1_filename, duplicate_2_filename
vb.
Senaryo:
#!/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()
DÜZENLE
OP düşünülerek, hepimiz nasıl kullanılacağına dair bir talimat eklemeyi unuttuk. Yinelenen sorular görünebileceğinden ( ve göründüğünden), yine de faydalı olabilir.
Nasıl kullanılır
- Komut dosyalarından birini boş bir dosyaya kopyalayın,
reorganize.py
Komut dosyasının baş bölümünde, hedef dizini ayarlayın (yeniden düzenlenecek dosyalarla):
reorg_dir = "/path/to/directory_to_reorganize"
(dizinde boşluk varsa tırnak işaretleri kullanın)
hariç tutmak istediğiniz olası uzantılar (muhtemelen hiçbiri, aşağıdaki gibi):
exclude = ()
ve daha sonra boş klasörleri kaldırmak isterseniz:
remove_emptyfolders = True
Komut dosyasını şu komutla çalıştırın:
python3 /path/to/reorganize.py
Not: Dosyaları taşımak yerine kopyalamak istiyorsanız , değiştirin:
shutil.move(subject, new_dir+"/"+name)
tarafından:
shutil.copy(subject, new_dir+"/"+name)
Lütfen önce küçük bir örnek üzerinde deneyin.
-iname '*.*'
Ben yaklaşık ... güzel fikri endişeliydi köşe durumlarda dikkatli olmalıdır!