หากคุณต้องการย้ายไฟล์ทั้งหมดภายในลำดับชั้นไดเรกทอรีไปยังไดเรกทอรีปลายทางเดียวในทุบตี≥4 (ใส่shopt -s globstar
ในของคุณ~/.bashrc
) หรือ zsh:
mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory
ในเปลือกหอยอื่น ๆ :
mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;
วิธีอ่านfind
คำสั่งนี้:
.
: สำรวจไดเรกทอรีปัจจุบัน
-name '*.xxx'
: ดำเนินการกับไฟล์ที่มีชื่อตรงกับรูปแบบนี้
-exec … \;
: ดำเนินการคำสั่งนี้ในแต่ละไฟล์{}
โดยแทนที่ด้วยพา ธ ไปยังไฟล์
มีคำสั่งที่ซับซ้อนมากขึ้นในการใช้find
ที่เร็วขึ้นหากคุณมีไฟล์จำนวนมากเนื่องจากไม่จำเป็นต้องเรียกใช้mv
กระบวนการแยกต่างหากสำหรับแต่ละไฟล์:
find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +
+
ในตอนท้ายบอกfind
เพื่อเรียกคำสั่งบนหลายไฟล์ในเวลา เนื่องจากfind
สามารถใส่ชื่อไฟล์ที่ส่วนท้ายของบรรทัดคำสั่งและmv
ต้องการให้ไดเรกทอรีปลายทางสุดท้ายเราใช้เชลล์ระดับกลางเพื่อจัดเรียงอาร์กิวเมนต์ใหม่ ( "$0"
เป็นอาร์กิวเมนต์แรกของเชลล์~/new-directory
และ"$@"
เป็นอาร์กิวเมนต์ที่ตามมาที่มาจากfind
กำลังขยายของ{}
)