ย่อไฟล์และลำดับชั้นของไฟล์จากบรรทัดคำสั่งของ Mac OS X

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


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

ตัวอย่างของการราบเรียบไดเรกทอรีแฟ้มที่ซ้อนกัน

เพื่อให้เข้าใจถึงสิ่งที่เรากำลังพยายามทำให้สำเร็จลองมาดูตัวอย่างโครงสร้างไดเร็กทอรีที่เรียกว่า TestDirectory ซึ่งอยู่ในโฟลเดอร์โฮมของผู้ใช้ ในตัวอย่างนี้ TestDirectory มีโฟลเดอร์ย่อยเช่น SubDirectory1, SubDirectory2, SubDirectory3 เป็นต้นแต่ละไฟล์มีอยู่ในโฟลเดอร์ที่เกี่ยวข้อง สิ่งที่เรากำลังทำอยู่นี่คือการทำให้โครงสร้างไดเร็กทอรีลื่นไหลย้ายไฟล์ทั้งหมดจาก SubDirectory (X) ไปยังไดเรกทอรีหลัก "TestDirectory" ไดเร็กทอรีและเนื้อหาเริ่มต้นที่แสดงซ้ำด้วยอาจมีลักษณะดังนี้:

$ find ~/TestDirectory/ -type f
~/TestDirectory/rooty.jpg
~/TestDirectory/SampleDirectory1/beta-tool-preview.jpg
~/TestDirectory/SampleDirectory1/alphabeta-tool.jpg
~/TestDirectory/SampleDirectory2/test-tools.jpg
~/TestDirectory/SampleDirectory3/test-png.jpg
~/TestDirectory/SampleDirectory3/test1.jpg
~/TestDirectory/SampleDirectory3/test2.jpg

เมื่อต้องการทำให้พาเรนต์และเนื้อหาย่อยนี้กลับไปอยู่ในโฟลเดอร์ TestDirectory คุณจะใช้สตริงคำสั่งต่อไปนี้:

find TargetDirectory/ -mindepth 2 -type f -exec mv -i '{}' TargetDirectory/ ';'

หลังจากที่เนื้อหาในไดเรกทอรีถูกแบนควรมีลักษณะดังนี้เมื่อแสดงไว้:

~/TestDirectory/rooty.jpg
~/TestDirectory/beta-tool-preview.jpg
~/TestDirectory/alphabeta-tool.jpg
~/TestDirectory/test-tools.jpg
~/TestDirectory/test-png.jpg
~/TestDirectory/test1.jpg
~/TestDirectory/test2.jpg

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

ทำให้โครงสร้างไดเร็กทอรีและลำดับชั้นของแฟ้มที่ซ้อนกันมีบรรทัดคำสั่ง

พร้อมที่จะดำเนินการต่อหรือไม่? สตริงคำสั่งที่เราจะใช้เพื่อลดโครงสร้างไดเร็กทอรีและย้ายไฟล์ทั้งหมดจากไดเรกทอรีย่อยไปยังฐานของไดเร็กทอรีเป้าหมายดังนี้:

find [DIRECTORY] -mindepth 2 -type f -exec mv -i '{}' [DIRECTORY] ';'

แทนที่ [DIRECTORY] ด้วยไดเร็กทอรีที่คุณต้องการให้เรียบโดยแสดงในตัวอย่างข้างต้น

ใช่ไดเรกทอรีปรากฏขึ้นสองครั้งในสตริงคำสั่งครั้งแรกคือไดเร็กทอรีที่กำลังค้นหาเพื่อทำให้พา ธ ย่อยของและเป็นครั้งที่สองเป็นปลายทางสำหรับรายการที่พบ

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

ดังที่ได้กล่าวมาแล้วคุณสามารถทำเช่นนี้ได้ใน Finder ของ OS X หรืออย่างน้อยก็ให้สังเกตการเปลี่ยนแปลงไฟล์และโฟลเดอร์ใน Finder Option + คลิกที่ลูกศรเล็ก ๆ ในมุมมอง List จะเปิดขึ้นมาทั้งหมดไดเรกทอรีย่อยแสดงลำดับชั้นของโฟลเดอร์ดังนี้:

หลังจากที่เล่นซอฟท์แวร์ bash และ zsh หลายแบบเคล็ดลับที่มีประโยชน์นี้ถูกทิ้งไว้โดย commenter ใน StackExcange และกลายเป็นวิธีการที่ง่ายที่สุดและเข้ากันได้ดีที่สุด หากคุณรู้จักวิธีที่ดีกว่าในการทำให้ข้อมูลที่ซ้อนกันอยู่ราบรื่นโปรดแจ้งให้เราทราบในความคิดเห็น!