โครงสร้างไดเรกทอรีที่เรียบ


15

ฉันมีโฟลเดอร์มัดอยู่ในโฟลเดอร์ แบบนี้

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

ฉันต้องการยุบโฟลเดอร์ทั้งหมดเพื่อให้ไฟล์ทั้งหมดภายใต้ folder1, โฟลเดอร์ 2, โฟลเดอร์ 3, ... โฟลเดอร์ n อยู่ภายใต้รูทโฟลเดอร์

วิธีที่เร็วที่สุดในการทำเช่นนี้ใน windows คืออะไร?


5
ขึ้นอยู่กับว่าคุณต้องการจัดการชื่อไฟล์ที่ซ้ำกันอย่างไร
Mark Allen

คำตอบ:


19

ไม่มีเหตุผลที่จะใช้เครื่องมือพิเศษหรือแม้แต่การเขียนสคริปต์ เพียงใช้ฟังก์ชั่นการค้นหาใน Explorer

  1. เปิดโฟลเดอร์ที่คุณต้องการแบนใน Explorer
  2. สร้างโฟลเดอร์ใหม่เลือกไฟล์ทั้งหมด (แต่ไม่ใช่โฟลเดอร์) และลากไปยังโฟลเดอร์นั้น (เพื่อหลีกเลี่ยงการรับไฟล์เหล่านี้สองชุด)
  3. ในช่องค้นหา (อันที่ด้านขวาของแถบที่อยู่) พิมพ์*และกด Enter
  4. หลังจากรายการเติมข้อมูลให้คลิกขวาและเลือกทั้งหมดจากนั้นคลิกขวาและตัด
  5. กดปุ่มย้อนกลับเพื่อกลับไปที่โฟลเดอร์เดิมจากนั้นคลิกขวาและวาง
  6. หากคุณมีชื่อซ้ำกันคุณจะได้รับแจ้งเกี่ยวกับวิธีจัดการกับสิ่งนี้ เลือกตัวเลือกที่เหมาะสมที่สุดสำหรับกรณีการใช้งานของคุณ (ฉันจะถือว่าเป็นการคัดลอกทั้งสองไฟล์) เพื่อหลีกเลี่ยงการได้รับแจ้งอีกครั้งโปรดใช้สิ่งนี้กับไฟล์ทั้งหมดด้วยช่องทำเครื่องหมายที่ด้านล่าง
  7. เลือกโฟลเดอร์ทั้งหมดตรวจสอบให้แน่ใจว่าว่างเปล่าโดยดูที่ป๊อปอัปเกี่ยวกับจำนวนไฟล์ที่เลือกแล้วลบออก

หากคุณต้องการมีสคริปต์เพื่อให้คุณสามารถเริ่มและลืมมันก็สามารถทำได้ คำสั่งในการแทนที่mv *\* .นั้นค่อนข้างง่าย ( for /r %f in (*.*) do @move "%~f" .) แต่ฉันแน่ใจว่าคุณต้องการจัดการรายการที่ซ้ำกันโดยไม่ทิ้งไว้เหมือนในคำตอบของ @Nicole Hamilton การต่อท้ายชื่อไฟล์ให้ซ้ำกันอาจเป็นวิธีที่ง่ายที่สุดในการทำ

คัดลอกและวางไฟล์แบตช์ต่อไปนี้ลงใน Notepad และบันทึกเป็น "flatten.cmd" (รวมถึงเครื่องหมายคำพูด):

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

หากต้องการใช้สคริปต์เพียงลากโฟลเดอร์ที่คุณต้องการเรียบให้เรียบ


1
ที่คล้ายกัน แต่ง่ายต่อการเข้าใจ: superuser.com/a/523854/433830
aparente001

หมายเหตุ: สคริปต์นี้เป็นตัวแยกระเบิด ฉันใช้มันในโฟลเดอร์ที่มีไดเรกทอรีย่อยหลายพันรายการและหลายหมื่นหลายพันไฟล์ย่อยและรอยเท้าหน่วยความจำเพิ่มขึ้นอย่างช้าๆ ฉันไม่คิดว่าฉันจะเจอปัญหา OOM แต่เป็นสิ่งที่ต้องคำนึงถึง
Nzall

@ ทุกคนฉันไม่มีปัญหาที่เชื่อว่าสามารถทำได้ แต่ฉันจะโทษ Microsoft ไม่ใช่รหัสของฉัน สิ่งที่ฉันทำคือเรียกรูทีนย่อยในแบตช์ไฟล์หลาย ๆ ครั้ง และฉันไม่เคยเรียกใช้มากกว่าหนึ่งครั้ง: แต่ละรูทีนย่อยจะทำงานจนกว่าจะเสร็จสมบูรณ์รันเพียงครั้งละหนึ่งกระบวนการเท่านั้น เราใช้หน่วยความจำมากแค่ไหนในการใช้?
trlkly

@trlkly ณ จุดหนึ่งมันเพิ่มขึ้นถึง 2 GB แม้ว่าฉันจะมีโฟลเดอร์และโฟลเดอร์ย่อยจำนวนมากประมาณ 75,000 ไฟล์และโฟลเดอร์นับพัน ครู่หนึ่งหลังจากที่มันลดขนาดลงเหลือประมาณ 8-900 MB มีการโหลดไฟล์ซ้ำหลายครั้ง ฉันทำสำเนา Javascript ไลบรารี่ 7,500 ไฟล์จำนวน 12 สำเนาเพื่อทดสอบว่าซอฟต์แวร์บางตัวสามารถจัดการโฟลเดอร์ที่มีไฟล์นับหมื่นไฟล์ได้อย่างไร
Nzall

@zall มันแปลกสำหรับฉันอย่างไม่น่าเชื่อ สคริปต์ไม่ควรทำเช่นนั้น เป็นหนึ่งในรูทีนย่อยที่นำตัวแปรเดี่ยวมาใช้เพื่อเพิ่มไฟล์ ฉันอาจต้องถามสิ่งที่อาจทำให้เกิดการใช้หน่วยความจำขนาดใหญ่เช่นนั้นหรืออะไรบางอย่าง
trlkly

9

คุณสามารถแบนใน Windows Explorer ได้โดยไปที่โฟลเดอร์ที่คุณต้องการแบนและค้นหาSystem.Kind:<>folderเพื่อแยกโฟลเดอร์ออกจากผลลัพธ์

จากนั้นคุณสามารถเลือกไฟล์ทั้งหมดด้วย CTRL + A แล้วคัดลอกและวางลงในโฟลเดอร์ใหม่ โปรดทราบว่า Windows Explorer จะถามคุณถึงวิธีจัดการกับชื่อไฟล์ที่ซ้ำกัน

ป้อนคำอธิบายรูปภาพที่นี่


1
โปรดทราบว่าการทำเช่นนี้คุณจะต้องพิมพ์ "โฟลเดอร์" ในการแปลที่สอดคล้องกัน (ตัวอย่างเช่นในภาษาอิตาลีSystem.Kind:<>cartella)
JohnKiller

0

สิ่งนี้เป็นเรื่องง่ายด้วย Unix shell นี่คือสิ่งที่คุณสามารถทำได้กับเชลล์ C แฮมิลตันของฉันเอง(รวมถึงรุ่นฟรี ) คุณสามารถทำสิ่งที่คล้ายกันมากกับCygwin bash

mv *\* .

หากไดเรกทอรีของคุณมีขนาดใหญ่มากอาจเป็นไปได้ว่าอาจใช้อักขระตัวแทนในบรรทัดคำสั่งยาวเกินไปสำหรับให้ Windows ส่งผ่านไปยังกระบวนการลูก (การเรียกใช้ Windows CreateProcessจำกัด รายการอาร์กิวเมนต์ไว้ที่อักขระ 32K Unicode) แต่ C เชลล์ไม่มีข้อ จำกัด ภายในดังนั้นคุณสามารถทำซ้ำในรายการทั้งหมดด้วยวิธีนี้:

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

ถึงจุดของ @ MarkAllen ด้านบนสมมติว่าประเภทนี้ไม่มีชื่อที่ซ้ำกัน หากมีการคัดลอกในภายหลังในรายการจะเขียนทับสำเนาที่เก่ากว่า หากเป็นข้อกังวลคุณสามารถวนซ้ำไฟล์mvเหล่านั้นได้หากคุณไม่เขียนทับ :tผู้ประกอบการเป็นผู้ประกอบหาง -eประกอบเป็นไฟล์ที่มีอยู่การทดสอบ

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

สิ่งนี้ยังคงอยู่ในไดเรกทอรีว่างเปล่าซึ่งบางทีคุณอาจไม่ต้องการหลังจากที่มันถูกทำให้ว่างเปล่า นั่นอาจเป็นการวนซ้ำครั้งต่อไปถ้ามันสำคัญ


ใช้ cygwin> mv * mv: ไม่สามารถ stat `* ': ไม่มีไฟล์หรือไดเรกทอรี
มากกว่าห้า

ใน Cygwin bashได้mv */* .ผลสำหรับฉัน
นิโคลแฮมิลตัน

3
บางคนได้รับการแก้ไขใน UNIXism ... หากคุณต้องการทำสคริปต์ใน Windows 7 จริงๆมี PowerShell คุณไม่จำเป็นต้องมีโปรแกรมจำลองการทุบตีปลอมอย่าง Cygwin

คุณไม่จำเป็นต้องมีแม้แต่ PowerShell บรรทัดคำสั่งปกติยังคงมีอยู่และสามารถทำสิ่งเดียวกันได้ ดูคำตอบของฉันด้านล่าง
trlkly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.