คุณจะย้าย (หรือคัดลอก) ไฟล์บางประเภทไปยังไดเรกทอรีใน Unix ได้อย่างไร?


22

ฉันยังไม่คุ้นเคยกับกลอุบายของทั้งหมดgrep/find/awk/xargsเลย

*.xxxฉันมีบางไฟล์ที่ตรงกับรูปแบบโดยเฉพาะอย่างยิ่งกล่าวว่า ไฟล์เหล่านี้อยู่ในตำแหน่งสุ่มทั่วทั้งไดเรกทอรี ฉันจะค้นหาไฟล์ดังกล่าวทั้งหมดและย้ายไฟล์ไปยังโฟลเดอร์ในโฮมไดเร็กตอรี่ของฉันบน Unix (อาจยังไม่มีอยู่)?


4
คุณต้องระวังเมื่อพูดถึง "ประเภทไฟล์" ในสภาพแวดล้อม unixy ตัวอย่าง ".xxx" ไม่ได้เป็นส่วนเสริมในแง่ของ Windows ".xxx" เพียงแค่สร้างส่วนต่อท้ายของชื่อไฟล์ "ประเภทไฟล์" เป็นหนึ่งในไม่กี่หมวดหมู่: ไฟล์ปกติ, ไฟล์อุปกรณ์, ลิงก์สัญลักษณ์, ไดเรกทอรี, ไพพ์ที่มีชื่อ, ซ็อกเก็ต Unix ตระกูล, อาจจะเป็นประเภทอื่น
Bruce Ediger

1
ดูเพิ่มเติมที่: unix.stackexchange.com/questions/7027/…
jasonwryan

@BruceEdiger ขอบคุณฉันเดาว่าฉันหมายถึง "รูปแบบชื่อไฟล์" จริง ๆ
qodeninja

คำตอบ:



17

หากคุณต้องการย้ายไฟล์ทั้งหมดภายในลำดับชั้นไดเรกทอรีไปยังไดเรกทอรีปลายทางเดียวในทุบตี≥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กำลังขยายของ{})


4

หากคุณต้องการทำซ้ำโครงสร้างไดเรกทอรีของไฟล์ต้นฉบับที่ตรงกันไปยังไดเรกทอรีเป้าหมายใหม่คุณสามารถใช้ประโยชน์จากตัวเลือก--parentsของ GNU cp :

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

คุณสามารถใช้โดยไม่ต้องพบ -exec‍เช่นกัน:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

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