Ratakan struktur direktori

15

Saya memiliki banyak folder di dalam folder. Seperti ini

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

Saya ingin menutup semua folder sehingga semua file di bawah folder1, folder 2, folder 3, ... folder n ada di bawah folder root.

Apa cara tercepat untuk melakukan ini di windows?

Lebih dari Lima
sumber
5
Tergantung, bagaimana Anda ingin menangani nama file duplikat?
Mark Allen

Jawaban:

19

Tidak ada alasan untuk menggunakan alat khusus atau bahkan skrip. Cukup gunakan fungsi pencarian di Explorer.

  1. Buka folder yang ingin Anda ratakan di Explorer.
  2. Buat folder baru, pilih semua file (tetapi bukan folder), dan seret ke folder itu (Ini akan menghindari dua salinan dari file-file itu.)
  3. Di kotak pencarian (yang ada di sebelah kanan bilah alamat), ketik *dan tekan Enter.
  4. Setelah daftar terisi, klik kanan dan pilih semua, lalu klik kanan dan Potong.
  5. Tekan tombol kembali untuk kembali ke folder asli, lalu klik kanan dan tempel.
  6. Jika Anda memiliki nama duplikat, Anda akan diminta cara menangani ini. Pilih opsi yang paling tepat untuk use case Anda. (Saya akan berasumsi akan menyalin kedua file.) Untuk menghindari diminta lagi, pastikan untuk menerapkan ini ke semua file dengan kotak centang di bagian bawah.
  7. Pilih semua folder, pastikan mereka kosong dengan melihat sembulan tentang jumlah file yang dipilih, dan kemudian hapus.

Jika Anda lebih suka memiliki skrip sehingga Anda bisa memulainya dan melupakannya, itu juga bisa dilakukan. Perintah untuk mengganti mv *\* .cukup mudah ( for /r %f in (*.*) do @move "%~f" .) tapi saya yakin Anda ingin menangani duplikat, tanpa meninggalkan mereka seperti dalam jawaban @Nicole Hamilton. Menambahkan nomor ke nama file duplikat mungkin adalah cara termudah untuk melakukannya.

Salin dan tempel file batch berikut ke dalam Notepad dan simpan sebagai "flatten.cmd" (termasuk tanda kutip):

@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"

Untuk menggunakan skrip, cukup seret folder yang ingin Anda ratakan di atasnya.

trlkly
sumber
1
Serupa tetapi lebih mudah dipahami: superuser.com/a/523854/433830
aparente001
Catatan: skrip ini pada dasarnya adalah bom fork. Saya menggunakannya pada folder dengan ribuan subdirektori dan puluhan ribu subfile dan jejak memori perlahan-lahan meningkat. Saya tidak berpikir saya akan mengalami masalah OOM, tapi itu sesuatu yang perlu diingat.
Nzall
@Nzall Saya tidak punya masalah percaya bahwa itu bisa melakukan itu, tapi saya akan menyalahkan Microsoft, bukan kode saya. Yang saya lakukan hanyalah memanggil subrutin dalam file batch beberapa kali. Dan saya tidak pernah menjalankan lebih dari satu waktu: setiap subrutin berjalan sampai selesai, hanya menjalankan satu proses pada satu waktu. Berapa banyak memori yang kita bicarakan tentang penggunaan?
trlkly
@ CtrlKly Pada satu titik itu naik menjadi 2 GB, meskipun saya memiliki cukup banyak folder dan subfolder, sekitar 75.000 file dan ribuan folder. Beberapa saat setelah itu turun kembali menjadi sekitar 8-900 MB. Ada banyak file duplikat sekalipun. Saya meratakan 12 salinan dari 7.500 file Javascript library sehingga saya bisa menguji bagaimana perangkat lunak tertentu akan menangani folder dengan puluhan ribu file.
Nzall
@Nzall Itu sangat aneh bagi saya. Tidak ada skrip yang bisa melakukan itu. Ini adalah satu subrutin yang menggunakan kembali satu variabel untuk menambah file. Saya mungkin harus bertanya apa yang dapat menyebabkan penggunaan memori sebesar itu pada SO atau sesuatu.
trlkly
9

Anda dapat meratakan di Windows Explorer dengan menavigasi ke folder yang ingin Anda ratakan dan mencari untuk System.Kind:<>foldermengecualikan folder dari hasil.

Anda kemudian dapat memilih semua file dengan CTRL + A dan menyalin dan menempelkannya ke folder baru. Perhatikan bahwa Windows Explorer akan menanyakan cara menangani nama file duplikat.

masukkan deskripsi gambar di sini

Matius
sumber
1
perhatikan bahwa agar ini berfungsi, Anda perlu mengetik "folder" dalam terjemahan lokal yang sesuai (misalnya, dalam bahasa Italia System.Kind:<>cartella)
JohnKiller
0

Hal semacam ini mudah dilakukan dengan shell Unix. Inilah yang dapat Anda lakukan dengan shell Hamilton C saya sendiri (termasuk versi gratisnya ). Anda dapat melakukan sesuatu yang sangat mirip dengan Cygwin bash.

mv *\* .

Jika direktori Anda benar-benar besar, mungkin saja wildcard menjadi terlalu lama baris perintah untuk Windows untuk diteruskan ke proses anak. ( Panggilan Windows CreateProcess membatasi daftar argumen menjadi 32K karakter Unicode.) Tetapi shell C tidak memiliki batas secara internal, sehingga Anda dapat mengulangi seluruh daftar dengan cara ini:

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

Untuk poin @ MarkAllen di atas, anggapan seperti ini tidak ada nama duplikat. Jika ada, salinan selanjutnya dalam daftar akan menimpa yang lebih lama. Jika itu masalah, Anda bisa beralih pada file, mvhanya jika Anda tidak menimpa. The :tOperator adalah operator yang ekor . The -eOperator adalah file ada tes .

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

Ini masih meninggalkan direktori kosong, yang mungkin tidak Anda inginkan setelah dikosongkan. Itu bisa menjadi iterasi berikutnya jika itu penting.

Nicole Hamilton
sumber
Menggunakan cygwin> mv *. mv: tidak bisa stat `* ': Tidak ada file atau direktori seperti itu
Lebih dari Lima
Di Cygwin bash, mv */* .bekerja untuk saya.
Nicole Hamilton
3
Beberapa orang sangat terpaku pada UNIXism ... Jika Anda benar-benar ingin melakukan scripting di Windows 7, ada PowerShell, Anda tidak memerlukan beberapa bash simulator palsu seperti Cygwin.
Anda bahkan tidak membutuhkan PowerShell. Baris perintah reguler masih ada dan dapat melakukan hal yang sama. Lihat jawaban saya di bawah ini.
trlkly