ฉันจะย้ายไฟล์ตามประเภทซ้ำจากไดเรกทอรีและไดเรกทอรีย่อยไปยังไดเรกทอรีอื่นได้อย่างไร


30

อะไรจะเป็นวิธีที่ดีในการย้ายประเภทไฟล์จากไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด

เช่น "ย้าย all * .ogg ใน / thisdir ซ้ำไปยัง / somedir" ฉันลองสองสิ่ง; ความพยายามที่ดีที่สุดของฉันคือ (ยังไม่ดีขนาดนั้น):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

มันกลับมาในแต่ละบรรทัดก่อนแต่ละชื่อไฟล์

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'

คำตอบ:


23

คุณสามารถใช้ find with xargsสำหรับสิ่งนี้

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

-I ในคำสั่งด้านบนบอก xargs สตริงการแทนที่ที่คุณต้องการใช้ (มิฉะนั้นจะเพิ่มอาร์กิวเมนต์ที่ส่วนท้ายของคำสั่ง)

หรือ
ในคำสั่งของคุณเพียงแค่พยายามย้าย '{}' หลังจากmvคำสั่ง

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;


1
โปรดอย่าลืมสำรองข้อมูลก่อนลองคำสั่งด้านบน :-)
Hemant

2
Btw สำหรับ -print0 แรกสำหรับ find และ -0 สำหรับ xargs ควรถูกใช้มากที่สุดเพื่อหลีกเลี่ยงช่องว่างในปัญหาชื่อไฟล์
maxschlepzig

@maxschlepzig: จุดดี ฉันจะแก้ไข
Hemant

2
ฉันขอแนะนำอย่างยิ่งให้ใช้mv -iที่นี่ดังนั้นคุณจะไม่เสี่ยงที่จะเขียนทับไฟล์หากมีสิ่งผิดปกติเกิดขึ้น
Gilles 'หยุดชั่วร้าย'

2
ด้วย mv จาก gnu core utils คุณสามารถใช้mv -t <targetdir>และ + แทน \;


9

ใน zsh หรือ bash 4 เพื่อรวบรวม*.oggไฟล์ทั้งหมดลงใน/somedir:

mv /thisdir/**/*.ogg /somedir

หากคุณต้องการสร้างลำดับชั้นไดเรกทอรีซ้ำ: (คำเตือนให้พิมพ์ลงในเบราว์เซอร์โดยตรง)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir

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