ย้ายไฟล์ทั้งหมดภายในโฟลเดอร์ย่อยไปยังโฟลเดอร์หลัก


0

ประการแรกฉันรู้ว่ามีคำถามที่คล้ายกันมากมายและฉันรู้เพราะฉันต้องลองปรับอย่างน้อย 5 ของพวกเขา แต่ฉันยังคงอยู่ที่นี่ถามเพราะเข้าใจเส็งเคร็ง CMD ของฉัน (ซึ่งจริง ๆ แล้วฉันคิดว่าฉันเริ่มดี จนถึงตอนนี้) ทำให้ฉันผิดหวังด้วยข้อผิดพลาดทั่วไปที่ไม่ช่วยเหลือและฉันไม่สามารถเข้าใจได้ว่าส่วนใดของไวยากรณ์ผิด อาจเป็นเพราะความจริงที่ว่าคำถามอื่น ๆ จะจัดการกับโครงสร้างโฟลเดอร์ / ชื่อไฟล์ของ OP ที่เกี่ยวข้องของพวกเขาและเมื่อฉันพยายามที่จะปรับรหัสให้เข้ากับโครงสร้างโฟลเดอร์ / ไฟล์ของตัวเองมันไม่ยอมทำงาน ดังนั้นฉันมาที่นี่เพื่อหาforวิธีการแก้ปัญหาวนซ้ำCMD ที่จริงจะทำงานกับโครงสร้างไฟล์และโฟลเดอร์ของฉันเอง

ฉันมีโฟลเดอร์หลักที่มีโฟลเดอร์อื่น ๆ อีกมากมายซึ่งมีไฟล์:

Parent Folder
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2

... และต่อไป

ฉันต้องการใช้การforวนซ้ำCMD ร่วมกับmoveคำสั่งเพื่อแยกไฟล์ทั้งหมดในโฟลเดอร์ย่อยไปยังโฟลเดอร์หลักโดยปล่อยให้โฟลเดอร์ย่อยแต่ละโฟลเดอร์ว่างเปล่า

เมื่อให้forลูปCMD โปรดทำลายสิ่งที่แต่ละส่วนของคำสั่งทำเช่นนี้จะช่วยให้แน่ใจว่าฉันเข้าใจรหัสและหวังว่าจะช่วยลดปัญหาที่ฉันได้รับจากการทำงานให้กับตัวเอง


จะทำอย่างไรถ้าคุณได้dir /s/b >a.a รับรายชื่อไฟล์ทั้งหมดหนึ่งไฟล์ต่อหนึ่งบรรทัด จากนั้นคุณmove อยู่ที่จุดเริ่มต้นของแต่ละบรรทัดและc:\blah\myparentfolderในตอนท้ายของแต่ละบรรทัดคุณจะมีรายการคำสั่งและสามารถตั้งชื่อไฟล์ blah.bat และรันมันได้
barlop

คำตอบ:


2

เอาล่ะฉันก็คิดออกโดยการปรับรหัสจากคำถามอื่น ขอบคุณ @AFH สำหรับการทำให้ชัดเจนในส่วนที่ฉันไม่แน่ใจเกี่ยวกับความเห็นต่อคำตอบนี้และสำหรับความช่วยเหลือทั่วไปของเขา - มันชื่นชมมาก

หากต้องการแตกไฟล์ทั้งหมดจากโฟลเดอร์ย่อยไปยังโฟลเดอร์หลัก

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

อย่าลืมแทนที่ทุกอินสแตนซ์PARENTFOLDERด้วยพา ธ ไปยังโฟลเดอร์ที่คุณต้องการแตกไฟล์

เพื่อแยกไฟล์ทั้งหมดจากโฟลเดอร์ย่อยและลบโฟลเดอร์ย่อยที่ว่างเปล่า

เป็นไปได้ยากที่คุณจะต้องเก็บโฟลเดอร์ย่อยที่ว่างไว้หลังจากที่แตกไฟล์ออกจากไฟล์เหล่านั้น - ฉันไม่ได้ทำเช่นนั้น - ดังนั้นคำสั่งด้านล่างจะทำการลบโดยอัตโนมัติเช่นกัน

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"

อีกครั้งให้แทนที่ทุกอินสแตนซ์ของPARENTFOLDERด้วยพา ธ ไปยังโฟลเดอร์ที่คุณต้องการแตกไฟล์

ถึงตอนนี้มันไม่ใช่ซับเดี่ยวอีกต่อไปและเริ่มรับความสับสนเล็กน้อยเมื่อวางลงในบรรทัดคำสั่งดังนั้นมันง่ายกว่าที่จะใส่ทุกอย่างลงในแบทช์ไฟล์ การใช้ตัวแปรสำหรับพา ธ ไปยังโฟลเดอร์พาเรนต์ช่วยให้คุณสามารถแทนที่เพียงหนึ่งอินสแตนซ์PARENTFOLDERที่จุดเริ่มต้นของไฟล์และยังเป็นตัวเลือกที่ปลอดภัยยิ่งขึ้นเพื่อป้องกันการลบโฟลเดอร์ว่างที่คุณอาจต้องการเก็บไว้โดยไม่ตั้งใจ

ไฟล์แบทช์

วางลงในไฟล์ข้อความแทนที่PARENTFOLDERด้วยพา ธ ไปยังโฟลเดอร์ที่คุณต้องการให้ทำงานและบันทึกด้วย.batส่วนขยาย ทำงานในไดเรกทอรีใด ๆ

@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
forไวยากรณ์คำสั่งไม่ได้มีเหตุผล แต่แรก%dกำหนดdเป็นตัวแปรห่วงและที่สอง%dคือสิ่งที่ตัวแปร loop ขยายที่ผ่านของแต่ละวง (Unix ไวยากรณ์เหตุผลมากขึ้น: for ... d in ... do ...) อินสแตนซ์แรกไม่ได้ถูกขยายดังนั้นจึงไม่จำเป็นต้องมีการอ้างถึงซึ่งแตกต่างจากหลังdoซึ่ง%dอาจขยายไปยังชื่อไฟล์ที่มีช่องว่างในตัว ไม่มีอะไรพิเศษเกี่ยวกับd: ตัวอักษรใด ๆ ที่สามารถใช้ แต่dมีเหตุผลสำหรับไดเรกทอรี (หรือfสำหรับไฟล์) ยิ่งไม่มีเหตุผล%%dต้องใช้ในไฟล์ batch ( .cmdหรือ.bat)
AFH

1
โดยการทดสอบผมคิดว่าคุณต้องการที่ซ้อนกันfor, for /d %d in (PARENTFOLDER\*) do for /r "%d" %f in (*.*) do move "%f" TARGETLOCATIONตามสายของ หากคุณรวมข้อกำหนดพิเศษไว้ในคำถามของคุณฉันจะส่งคำตอบเพื่อผลประโยชน์ของผู้อื่น
AFH

1
หากPARENTFOLDERมีช่องว่างจะต้องมีการเสนอราคา ฉันขอแนะนำให้คุณใส่echoระหว่างตัวแรกdoและตัวที่สองforเพื่อตรวจสอบว่าforคำสั่งที่ซ้อนกันจะถูกดำเนินการอย่างไร เงื่อนไขของคุณมีตัวแปรที่เป็นไปได้มากมายที่ฉันไม่สามารถตั้งค่าการทดสอบตัวแทนที่นี่
AFH

1
หากคุณไม่ได้พูดPARENTFOLDERและเป็นสิ่งที่เหมือนname with spacesเป็นครั้งแรกที่forจะมีการประเมินเป็นfor /d %d in (name with spaces\*) do ...ดังนั้นdจะกลายเป็นอย่างต่อเนื่องname, withแล้วไฟล์ใด ๆ spaces\*ที่ตรงกับหน้ากาก วงเล็บไม่หยุดความต้องการที่จะพูด ครั้งเดียวที่คุณไม่จำเป็นต้องพูดคือใช้cdคำสั่งซึ่งใช้เวลาที่เหลือของบรรทัดเป็นพารามิเตอร์เดียวรวมถึงช่องว่างใด ๆ (แม้ว่าส่วนTabขยายแทรกใบเสนอราคา); mdและrdสามารถดำเนินการกับหลายไดเรกทอรีได้ดังนั้นจำเป็นต้องมีเครื่องหมายอัญประกาศหากชื่อมีช่องว่าง
AFH

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