แทนที่จะใช้find(ซึ่งทำงานได้ดี) คุณสามารถใช้เชลล์ด้วยเหตุนี้
สมมติว่าคุณต้องการไฟล์ทั้งหมดจาก $ PWD ถึง $ DEST ความพยายามตามธรรมชาติจะเป็น:
mv $PWD/* $DEST
มันทำงานอย่างไร นิพจน์ "$ PWD / *" ขยายเป็นชื่อของไฟล์ทั้งหมดในไดเรกทอรีนั้น คุณสมบัติเปลือกนี้เรียกว่า "globbing" อาร์กิวเมนต์สุดท้ายของmvคือไดเร็กทอรีปลายทาง หากคุณมีไฟล์จำนวนมากสิ่งนี้จะไม่ทำงานเนื่องจากความยาวของบรรทัดคำสั่งมี จำกัด
แต่วิธีการแก้ปัญหามีปัญหาที่มันละเว้นไฟล์ dot - หรือไฟล์ "ซ่อน" ไฟล์และไดเรกทอรีที่ชื่อขึ้นต้นด้วย "." ในการแก้ปัญหานี้คุณต้องบอกให้เปลือกของคุณรวม dotfiles ไว้ด้วย เมื่อต้องการทำเช่นนี้ใช้
shopt -s dotglob
เมื่อใช้bash(และคุณอาจใช้bashจนกว่าคุณจะเปลี่ยนค่าเริ่มต้น) ในเปลือกนี้คำสั่งดังกล่าวจะทำงานสำหรับ dotfiles เช่นกัน
นอกจากนี้zshคุณยังมีตัวเลือกให้เลือกแบบนี้เป็นกรณี ๆ ไป เมื่อต้องการทำเช่นนี้ใส่
setopt extendedglob
.zshrcในของคุณ จากนั้นคุณสามารถใช้
mv $PWD/*(D) $DEST
เพื่อย้ายไฟล์ทั้งหมดรวมถึง dotfiles ("D" มีผลต่อการเปิดใช้งานตัวเลือก "GLOB_DOTS" ชั่วคราว)
ตอนนี้คำถามเดิมคือการย้ายไฟล์ปกติทั้งหมด (ไม่ใช่ไดเรกทอรี) จากไดเรกทอรีย่อยทั้งหมดและไดเรกทอรีย่อยของพวกเขาไปยังไดเรกทอรีเดียว สามารถทำได้ด้วยzsh:
mv $PWD/**/*(D.)
ที่นี่การแสดงออก**/*ทำให้ globber ลงไปซ้ำในไดเรกทอรีย่อย Dหมายถึง "ยังเลือก dotfiles' นั้น.หมายถึง 'เพียงเลือกไฟล์ปกติไม่ไดเรกทอรี'