Alt klasörler içindeki tüm dosyaları üst klasöre taşıyın


0

Birincisi, benzer soruların tonlarca olduğunun farkındayım ve biliyorum ki bunlardan en az 5 tanesini adapte etmeye çalışmış olmalıyım, ama hala burada soruyorum çünkü CMD'nin berbat kavrayışımı (ki gerçekten iyi olduğumu sanıyordum) Bu noktaya kadar) beni genel, yararsız hatalarla sinirlendiriyor ve sözdiziminin hangi kısmının yanlış olduğunu anlayamıyorum. Bu, diğer soruların kendi OP'lerinin klasör / dosya adı yapılarını ele almasından kaynaklanmaktadır ve kodu kendi klasör / dosya yapıma uyarlamaya çalıştığımda çalışmayı reddediyor. Bu nedenle, burada forkendi dosya ve klasör yapım için çalışacak bir CMD döngü çözümü istiyorum.

İçinde dosyalar olan birçok başka klasörü içeren bir üst klasör var:

Parent Folder
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2

...ve bunun gibi.

Her alt klasörü boş bırakarak, alt klasörlerdeki tüm dosyaları ana klasöre çıkarmak foriçin movekomutla birlikte bir CMD döngüsü kullanmak istiyorum .

CMD fordöngüsünü verirken, lütfen komutun her bir parçasının ne yaptığını kesin; bu, kodu anladığımdan emin olmamıza yardımcı olur ve umarım, kendim için çalışmamdaki sorunları en aza indirir.


peki dir /s/b >a.a , her bir satır için bir tane olmak üzere tüm dosyaların bir listesini almak için. Eğer Sonra move her satırın başında ve c:\blah\myparentfolderher satırın sonunda o zaman emir komuta listesi var ve dosya blah.bat isim ve çalıştırabilirsiniz
barlop

Yanıtlar:


2

Tamam, sonunda başka bir sorudan kodu uyarlayarak çözdüm. Bu cevabın yorumlarında emin olamadığım kısımları açıklığa kavuşturduğum için @ AFH'ye ve bu konudaki genel yardımına teşekkürler - çok takdir ediyorum.

Tüm Dosyaları Alt Klasörlerden Ana Klasörüne Çıkarma

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER"

PARENTFOLDERDosyaları ayıklamak istediğiniz klasör yolunun tüm örneklerini değiştirmeyi unutmayın .

Tüm Dosyaları Alt Klasörlerden Çıkarma ve Boş Alt Klasörleri Silme

Dosyaları altlarından çıkardıktan sonra boş kalan alt klasörleri geride tutmanız gerekmemektedir - kesinlikle yapmadım - bu nedenle aşağıdaki komut da onların silinmesini otomatik hale getirir.

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER" && cd "PARENTFOLDER" && for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

Bir kez daha, tüm PARENTFOLDERdosyaları, ayıklamak istediğiniz klasörün yolu ile değiştirin.

Bununla birlikte, bu noktadan sonra, artık tek bir astar değildir ve komut satırına yapıştırıldığında biraz sarsılmaya başlar, bu yüzden her şeyi bir toplu iş dosyasına koymak daha kolaydır. Üst klasöre giden yol için değişkenleri kullanmak PARENTFOLDER, dosyanın başında sadece bir örneğini değiştirmenize olanak sağlar ve aynı zamanda daha güvenli bir seçenektir, saklamak isteyebileceğiniz boş klasörlerin yanlışlıkla silinmesini önler.

Toplu iş dosyası

Bir metin dosyasına yapıştırın, PARENTFOLDERçalışmasını istediğiniz klasörün yoluyla değiştirin ve .batuzantıyla kaydedin . Herhangi bir dizinde çalıştırın.

@ECHO OFF
SETLOCAL
SET parent="PARENTFOLDER"
CD /d %parent% 
FOR /r %parent% %%d IN (*.*) DO MOVE "%%d" %parent% 
FOR /f "delims=" %%d IN ('DIR /a:d /s /b ^| SORT /r') DO RD "%%d"
ECHO Done. Press any key to terminate script.
PAUSE >NUL

1
forKomut sözdizimi rasyonel değildir, fakat ilk olarak %dtanımlayan dçevrim değişken olarak ve ikinci %ddöngüsel değişken döngü her geçişte genişler ne (Unix sözdizimi daha rasyoneldir: for ... d in ... do ...). O sonra aksine alıntı gerekmez böylece ilk örneği, genişletilmediğinde do, nerede %dgömülü boşlukları ile dosya adlarına genişleyebilir. Özel bir şey yok d: herhangi bir tek harf kullanılabilir, ancak ddizinler (veya fdosyalar için) mantıklıdır . Daha da irrasyonel %%dolarak bir toplu iş dosyasında ( .cmdveya .bat) kullanılmalıdır .
AFH

1
Test olmadan for, çizgileri boyunca iç içe geçmiş bir yer almak istediğinizi düşünüyorum for /d %d in (PARENTFOLDER\*) do for /r "%d" %f in (*.*) do move "%f" TARGETLOCATION. Sorunuza ek gereksinimler eklerseniz, başkalarının yararına bir cevap gönderirim.
AFH

1
PARENTFOLDERBoşluklar varsa , alıntılanması gerekir. Hangi iç içe komutun uygulanacağını kontrol etmek echoiçin birinci doile ikinci arasında bir boşluk bırakmanızı öneririm . Koşullarınız, burada temsili bir test oluşturamayacağım kadar olası değişkenlere sahip. forfor
AFH

1
Eğer alıntı yoksa PARENTFOLDERve böyle bir şey var name with spaces, ilk forolarak değerlendirecek for /d %d in (name with spaces\*) do ..., bu nedenle darka arkaya olacak name, withdaha sonra maskeyi uyan herhangi bir dosya spaces\*. Parantez, alıntı yapma zorunluluğunu durdurmaz. Alıntıya gerek duymamanız gereken tek zaman cd, satırın geri kalanını tek bir parametre olarak alan herhangi bir boşluk da dahil olmak üzere ( Tabgenişleme tırnak eklerse) komuttur ; mdve rdbirden fazla dizin üzerinde hareket edebilir, bu nedenle isimlerin boşlukları varsa alıntılara ihtiyacınız var.
AFH

1
Çözdüğüne sevindim.
AFH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.