ฉันจะหาไฟล์ * .mp3 ด้วยคำสั่งแบบเรียกซ้ำเช่นเดียวกับls -R *.mp3
ในไดเรกทอรีที่มีหลายไดเรกทอรีย่อยและในตอนท้ายให้คัดลอกไฟล์เหล่านี้ในไดเรกทอรีที่ฉันเลือก
ขอบคุณสำหรับการสนับสนุน.
ฉันจะหาไฟล์ * .mp3 ด้วยคำสั่งแบบเรียกซ้ำเช่นเดียวกับls -R *.mp3
ในไดเรกทอรีที่มีหลายไดเรกทอรีย่อยและในตอนท้ายให้คัดลอกไฟล์เหล่านี้ในไดเรกทอรีที่ฉันเลือก
ขอบคุณสำหรับการสนับสนุน.
คำตอบ:
คำสั่งคือ:
find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;
ทางเลือก:
find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/
ตัวอย่าง:
alex@MaD-pc:~/test$ ls
1 2 3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt 2.mp3 3.txt
2:
4.txt 5.mp3 6.txt
3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3 5.mp3
สำหรับข้อมูลเพิ่มเติม:
man find
xargs
โดยทั่วไปจะเร็วกว่ามาก ฉันเพิ่งจะทำการทดสอบอย่างรวดเร็วที่นี่หาโหลดไฟล์ c และเรียกใช้ls -l
พวกเขา มันคือ 0m2.420s xargs
และ 0m25.494s สำหรับ-exec
... เห็นได้ชัดว่าในกรณีนี้การcp
ดำเนินการจะใช้เวลาส่วนใหญ่ดังนั้นมันอาจจะไม่สำคัญ แต่มันก็คุ้มค่าที่จะจดบันทึก
-n`` switch to the
คำสั่ง cp` เพื่อหลีกเลี่ยงการเขียนทับในกรณีของชื่อที่ซ้ำกัน (หรือการเขียนสคริปต์ที่ตรวจสอบรายการที่ซ้ำกันก่อนที่จะคัดลอกและเปลี่ยนชื่อเป้าหมายตามความจำเป็น)
นอกจากนี้ยังมีวิธีอื่นที่ฉันคิดว่าจะเหมาะกับวัตถุประสงค์ของคุณอย่างสมบูรณ์แบบ คุณสามารถรวมfind
กับwhile
ลูปและไม่จำเป็นต้องใช้อย่างใดอย่างหนึ่งexec
หรือxargs
ทั้งหมด ตัวอย่างเช่นหากคุณต้องการคัดลอกmp3s
จากโฟลเดอร์ดาวน์โหลดของคุณไปยังโฟลเดอร์เพลงคุณจะใช้สคริปต์ต่อไปนี้ซึ่งฉันได้ใช้หลายครั้ง
คุณสามารถปรับเปลี่ยนวิธีที่คุณต้องการโดยเปลี่ยนไดเรกทอรีที่find
ค้นหาและวางไฟล์ผลลัพธ์ หากไม่มีการระบุไดเรกทอรีfind
จะค้นหาทั้งโฟลเดอร์หลัก คุณยังสามารถเปลี่ยนcp
เป็นmv
หรือคำสั่งอื่น ๆ มันค่อนข้างเร็วเพราะฉันเพิ่งทดสอบกับ.jpg
ไฟล์3945 ! chmod +x myscript
คัดลอกลงในตัวแก้ไขข้อความบันทึกมันแล้วทำให้ปฏิบัติการโดยการเรียกใช้
#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f;
do cp -- "$f" ~/Music ;
done
ที่ Bash wiki ที่ระบุไว้นี้จะแสดงว่ามีประโยชน์อย่างไรที่จะรวมwhile
ลูปและread
คำสั่งเพื่อประมวลผลเอาต์พุตของfind
คำสั่ง; และวิธีที่ฉันทำก็ทำให้แน่ใจได้ว่าสคริปต์จะไม่แตกถ้าชื่อไฟล์มีช่องว่างหรืออักขระอื่น ๆ ที่ไม่คาดคิดหรืออักขระพิเศษ
สำหรับข้อมูลทั่วไปเพิ่มเติมเกี่ยวกับfind
คำสั่งใส่ในขั้วman find
หรือดูmanpages อูบุนตูออนไลน์ สำหรับการแนะนำที่ดีเกี่ยวกับการใช้งานการค้นหาให้ดูบทความนี้เช่นกัน
find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; done
ง่ายกว่านี้?
-n`` switch to the
คำสั่ง cp` เพื่อหลีกเลี่ยงการเขียนทับในกรณีของชื่อที่ซ้ำกัน (หรือการเขียนสคริปต์ที่ตรวจสอบรายการที่ซ้ำกันก่อนที่จะคัดลอกและเปลี่ยนชื่อเป้าหมายตามความจำเป็น)
find /path/to/dir/ -name '*.c' | xargs cp -t /target/