if not os.path.exists(hedef_klasor):
os.makedirs(hedef_klasor)
# Mevcut çalışma dizinini al
kaynak_klasor = os.getcwd()
for kok, alt_klasorler, dosyalar in os.walk(kaynak_klasor):
for dosya in dosyalar:
kaynak_dosya_yolu = os.path.join(kok, dosya)
# Script dosyasının kendisini taşımamak için kontrol ekleyelim
if os.path.abspath(kaynak_dosya_yolu) == os.path.abspath(os.path.join(kaynak_klasor, 'dosyalari_topla.py')):
continue
hedef_dosya_yolu = os.path.join(hedef_klasor, dosya)
# Aynı isimde dosya varsa üzerine yazmamak için numaralandır
sayac = 1
while os.path.exists(hedef_dosya_yolu):
isim, uzanti = os.path.splitext(dosya)
yeni_isim = f"{isim}_{sayac}{uzanti}"
hedef_dosya_yolu = os.path.join(hedef_klasor, yeni_isim)
sayac += 1
# Dosyayı taşı
shutil.move(kaynak_dosya_yolu, hedef_dosya_yolu)
print(f"Taşındı: {dosya}")
if name == “main”:
hedef_klasor_adi = “Toplanan_Dosyalar”
dosyalari_topla(hedef_klasor_adi)
# Kullanıcıdan tek tuşa basmasını bekleme
input(f"\nTüm dosyalar '{hedef_klasor_adi}' klasörüne taşındı. Çıkmak için Enter'a basın...")
Şu an telefonda olduğum için doğru okuyamamış olabilirim.
For döngüsünde gördüğüm kadarıyla ve yanlış anlamamışsam betik kendi bulunduğu yerdeki dosyaları hedefe göndermeye ayarlanmış ama kendisini hariç tutmamış. Daha fonksiyonel yapabilmek için gtk veya qt ile bir gui oluşturup, kaynak nerede olursa olsun onları seçtirip hedefe gönderebilirsiniz. Hatta sürükle bırak desteği ile klasörü komple seçtirip, sadece içindekileri hedefletebilirsiniz.
Flood mesaj için özür dilerim, ayrı ek yapmalıyım.
Başlıktaki sorunun yanıtı hayır, ben yapamam.
Ama yapay zekaya yaptırdım. Aşağıdaki uygulama başarılı çalışıyor:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Bu uygulama yapay zeka ile yapılmıştır.
# Eğitim amaçlıdır.
# GNU GPLv3 lisansı kapsamındadır.
import os
import shutil
import sys
from PyQt6 import QtCore
from PyQt6.QtWidgets import (
QApplication,
QWidget,
QVBoxLayout,
QHBoxLayout,
QPushButton,
QLineEdit,
QLabel,
QFileDialog,
QMessageBox
)
# Gnome ve Wayland ortamlarında kararlı Qt6 çalışması için gelişmiş yapılandırma
if os.environ.get("XDG_SESSION_TYPE") == "wayland":
os.environ["QT_QPA_PLATFORM"] = "wayland"
os.environ["QT_WAYLAND_DISABLE_WINDOWDECORATION"] = "0"
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1"
os.environ["GDK_BACKEND"] = "wayland"
else:
os.environ["QT_QPA_PLATFORM"] = "xcb"
class DosyaTasiyici(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# Sürükle-bırak desteğini aktifleştiriyoruz
self.setAcceptDrops(True)
self.setWindowTitle("Dosya Taşıyıcı")
self.resize(500, 200)
self.kaynak_dosyalar = [] # kaynak klasörün içindekileri hafızaya aldırıyoruz.
# Ana dikey yerleşim
ana_duzen = QVBoxLayout()
# Sürükle-bırak alanı için mavi kesikli çizgili etiket
self.etiket = QLabel("\n\nKaynak klasörü bu alana sürükleyip bırakın\n\n")
self.etiket.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.etiket.setStyleSheet("border: 2px dashed #3498db; border-radius: 5px; background-color: transparent;")
ana_duzen.addWidget(self.etiket)
# Yatay yerleşim (Yol alanı ve Gözat butonu için)
yatay_duzen = QHBoxLayout()
self.yol_alani = QLineEdit()
self.yol_alani.setPlaceholderText("Hedef klasör yolu...")
yatay_duzen.addWidget(self.yol_alani)
self.btn_gozat = QPushButton("Gözat...")
self.btn_gozat.clicked.connect(self.klasor_sec)
yatay_duzen.addWidget(self.btn_gozat)
ana_duzen.addLayout(yatay_duzen)
# Taşıma işlemini başlatan buton
self.btn_tasi = QPushButton("Mevcut Klasör İçeriğini Taşı")
self.btn_tasi.clicked.connect(self.dosyalari_tasi)
ana_duzen.addWidget(self.btn_tasi)
self.setLayout(ana_duzen)
# Sürüklenen nesne pencere sınırlarına girdiğinde
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
# Bırakma işlemi gerçekleştiğinde
def dropEvent(self, event):
urls = event.mimeData().urls()
if urls:
yerel_yol = urls[0].toLocalFile()
# Bırakılan nesne bir klasör ise içindekileri (gizliler dahil) listeye alıyoruz
if os.path.isdir(yerel_yol):
self.kaynak_dosyalar = []
try:
for nesne in os.listdir(yerel_yol):
tam_yol = os.path.join(yerel_yol, nesne)
self.kaynak_dosyalar.append(tam_yol)
self.etiket.setText(f"\n\nKaynak yüklendi!\nTaşınacak nesne sayısı: {len(self.kaynak_dosyalar)}\n\n")
event.acceptProposedAction()
except Exception as e:
QMessageBox.critical(self, "Hata", f"Klasör içeriği okunamadı: {str(e)}")
else:
QMessageBox.warning(self, "Hata", "Lütfen bir dosya değil, içeriği alınacak kaynak klasörü sürükleyin!")
# Gözat butonu tetiklendiğinde
def klasor_sec(self):
secilen_dizin = QFileDialog.getExistingDirectory(self, "Hedef Klasörü Seç", os.path.expanduser("~"))
if secilen_dizin:
self.yol_alani.setText(secilen_dizin)
# Taşıma mantığı
def dosyalari_tasi(self):
hedef_dizin = self.yol_alani.text().strip()
if not hedef_dizin or not os.path.isdir(hedef_dizin):
QMessageBox.warning(self, "Hata", "Lütfen geçerli bir hedef klasör seçin!")
return
if not self.kaynak_dosyalar:
QMessageBox.warning(self, "Hata", "Lütfen önce kaynak klasörü sürükle-bırak alanına bırakın!")
return
tasinan_sayisi = 0
hata_sayisi = 0
for kaynak in self.kaynak_dosyalar:
# Dosya veya klasörün sadece adını alıyoruz
nesne_adi = os.path.basename(kaynak)
hedef = os.path.join(hedef_dizin, nesne_adi)
# Hedef klasörün kendi içindeki bir şeyi kendine taşımasını engelleme kontrolü
if kaynak == hedef_dizin or os.path.commonpath([kaynak]) == os.path.commonpath([kaynak, hedef_dizin]):
hata_sayisi += 1
continue
try:
shutil.move(kaynak, hedef)
tasinan_sayisi += 1
except Exception:
hata_sayisi += 1
if tasinan_sayisi > 0 or hata_sayisi > 0:
QMessageBox.information(
self,
"İşlem Tamamlandı",
f"Başarıyla taşınan nesne: {tasinan_sayisi}\nHata oluşan nesne: {hata_sayisi}"
)
# İşlem bittiğinde listeyi temizle ve etiketi eski haline getir
self.kaynak_dosyalar = []
self.etiket.setText("\n\nHedef klasörü bu alana sürükleyip bırakın\n\n")
else:
QMessageBox.information(self, "Bilgi", "Taşınacak nesne bulunamadı veya işlem gerçekleştirilemedi.")
if __name__ == "__main__":
uygulama = QApplication(sys.argv)
# Tercih edilen Fusion stili uygulanıyor
uygulama.setStyle("Fusion")
pencere = DosyaTasiyici()
pencere.show()
sys.exit(uygulama.exec())
Etiketlerde bazı hatalar oluşmuş. Kaynak klasörü seçin yerine hedef klasörü seçin yazıyor sürükle bırak widgetinin içinde. Onları elle düzeltebilirsiniz. (Edit: kod etiketi içinden düzelttim tamam.)