Dizin yapısını düzleştirin


15

Klasörler içinde bir grup klasörüm var. Bunun gibi

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

Klasör1, klasör 2, klasör 3, ... klasör n altındaki tüm dosyalar kök klasör altında olacak şekilde tüm klasörleri daraltmak istiyorum.

Bunu pencerelerde yapmanın en hızlı yolu nedir?


5
Bu, yinelenen dosya adlarını nasıl işlemek istersiniz?
Mark Allen

Yanıtlar:


19

Özel araçlar veya komut dosyası kullanmak için hiçbir neden yoktur. Explorer'daki arama işlevini kullanmanız yeterlidir.

  1. Düzleştirmek istediğiniz klasörü Explorer'da açın.
  2. Yeni bir klasör oluşturun, tüm dosyaları seçin (ancak klasörleri değil) ve bu klasöre sürükleyin (Bu, bu dosyaların iki kopyasını almaktan kaçınır.)
  3. Arama kutusuna (adres çubuğunun sağında bulunan) yazın *ve Enter tuşuna basın.
  4. Liste doldurulduktan sonra, sağ tıklayın ve tümünü seçin, ardından sağ tıklayın ve Kesin.
  5. Orijinal klasöre geri dönmek için geri düğmesine basın, ardından sağ tıklayıp yapıştırın.
  6. Yinelenen adlarınız varsa, bununla nasıl başa çıkmanız istenir. Kullanım durumunuz için en uygun seçeneği seçin. (Her iki dosyayı da kopyalayacağınızı varsayacağım.) Tekrar sorulmasını önlemek için, bunu altta onay kutusu bulunan tüm dosyalara uyguladığınızdan emin olun.
  7. Tüm klasörleri seçin, seçilen dosya sayısı hakkındaki açılır pencereye bakarak boş olduklarından emin olun ve ardından silin.

Eğer bir senaryoyu tercih ederseniz, onu başlatabilir ve unutabilirsiniz, bu da yapılabilir. Değiştirme komutu mv *\* .oldukça kolaydır ( for /r %f in (*.*) do @move "%~f" .), ancak yinelenenleri @Nicole Hamilton'un cevabında olduğu gibi geride bırakmadan işlemek istediğinizden eminim. Yinelenenlerin dosya adına bir sayı eklemek muhtemelen bunu yapmanın en kolay yoludur.

Aşağıdaki toplu iş dosyasını kopyalayıp Not Defteri'ne yapıştırın ve "flatten.cmd" (tırnak işaretleri dahil) olarak kaydedin:

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

Komut dosyasını kullanmak için düzleştirmek istediğiniz klasörü sürükleyin.


1
Benzer ama anlaşılması daha kolay: superuser.com/a/523854/433830
aparente001

Not: Bu senaryo aslında bir çatal bombasıdır. Binlerce alt dizin ve on binlerce alt dosya içeren bir klasörde kullanıyorum ve bellek ayak izi yavaşça artıyor. OOM sorunlarıyla karşılaşacağımı sanmıyorum, ama akılda tutulması gereken bir şey.
Nzall

@Nzall Bunu yapabileceğine inanan bir sorunum yok, ama kodumu değil Microsoft'u suçlarım. Tek yaptığım, toplu iş dosyasında bir alt programı birkaç kez çağırmak. Ve asla aynı anda birden fazla çalıştırmam: her altyordam tamamlanana kadar çalışır ve her seferinde yalnızca bir işlem çalıştırır. Kullanılmanın ne kadar hafızasından bahsediyoruz?
trlkly

@trlkly Bir noktada 2 GB'a kadar çıktı, ancak oldukça fazla miktarda klasör ve alt klasör, yaklaşık 75.000 dosya ve binlerce klasör vardı. Birkaç dakika sonra tekrar 8-900 MB'a düştü. Yine de bir sürü yinelenen dosya vardı. 7.500 dosya Javascript kütüphanesinin 12 kopyasını düzleştiriyordum, bu yüzden belli yazılımların on binlerce dosya içeren bir klasörü nasıl işleyeceğini test edebilirdim.
Nzall

@Nzall Bu benim için inanılmaz garip. Senaryo bunu yapmaz. Dosyayı artırmak için tek bir değişkeni yeniden kullanan bir alt yordamdır. SO'da bu kadar büyük bellek kullanımına neyin neden olabileceğini sormak zorunda kalabilirim.
trlkly

11

Düzleştirmek istediğiniz klasöre System.Kind:<>foldergidip klasörleri sonuçlardan hariç tutmak için Windows Gezgini'nde düzleştirebilirsiniz .

Daha sonra CTRL + A ile tüm dosyaları seçebilir ve kopyalayıp yeni bir klasöre yapıştırabilirsiniz. Windows Gezgini'nin yinelenen dosya adlarıyla nasıl başa çıkacağınızı soracağını unutmayın.

resim açıklamasını buraya girin


1
Bunun çalışması için karşılık gelen yerelleştirilmiş çeviriye "klasör" yazmanız gerektiğini unutmayın (örneğin, İtalyancada System.Kind:<>cartella)
JohnKiller

0

Unix kabuğu ile bu tür şeyler kolaydır. İşte kendi Hamilton C kabuğumla neler yapabileceğiniz ( ücretsiz sürüm dahil ) Cygwin bash ile çok benzer bir şey yapabilirsiniz .

mv *\* .

Dizininiz gerçekten büyükse, Windows'un bir alt işleme geçmesi için çok uzun bir komut satırına joker karakter eklenmesi olasıdır. (Windows CreateProcess çağrısı, bağımsız değişken listesini 32K Unicode karakterlerle sınırlar.) Ancak C kabuğunun dahili olarak bir sınırı yoktur, bu nedenle tüm listeyi şu şekilde yineleyebilirsiniz:

foreach i ( *\* )
   mv $i .
end

Yukarıdaki @ MarkAllen'in noktasına gelince, bu tür yinelenen adlar olmadığını varsayar. Varsa, listedeki sonraki kopyalar eskilerinin üzerine yazılır. Bu bir endişe ise, dosyaları mvsadece üzerine yazmıyorsanız yineleyebilirsiniz . :tOperatörüdür kuyruk operatörü . -eOperatörüdür dosya testi var .

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

Bu hala boş dizinleri bırakıyor, belki de boşaltıldıktan sonra istemiyorsunuz. Önemli olsaydı bu bir sonraki yineleme olabilir.


Cygwin> mv * kullanarak . mv: stat `* ' olamaz : Böyle bir dosya veya dizin yok
Beşten Fazla

Cygwin bash, mv */* .benim için çalışıyor.
Nicole Hamilton

3
Bazı insanlar UNIXism'de çok sabittir ... Windows 7'de gerçekten komut dosyası yapmak istiyorsanız, PowerShell var, Cygwin gibi sahte bir bash simülatörüne ihtiyacınız yok.

PowerShell'e bile ihtiyacınız yok. Normal komut satırı hala mevcuttur ve aynı şeyleri yapabilir. Cevabımı aşağıda görebilirsiniz.
trlkly
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.