แทนที่จะใช้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' นั้น.
หมายถึง 'เพียงเลือกไฟล์ปกติไม่ไดเรกทอรี'