คัดลอกไฟล์ซ้ำจากไดเรกทอรีหนึ่งไปอีกไดเรกทอรีหนึ่งซ้ำ


11

/media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInsideฉันมีเพลงของฉันทั้งหมดในโฟลเดอร์ ฉันต้องการคัดลอก mp3 ทั้งหมดไปที่/media/kalenpw/HDD/Musicฉันใช้:

cp -R /media/kalenpw/MyBook/Music/*.mp3 /media/kalenpw/HDD/Music

อย่างไรก็ตามนี่เป็นการคัดลอก mp3s ในโฟลเดอร์เพลงรูทเท่านั้นและไม่ได้เปิดไดเรกทอรีย่อยของศิลปินและคัดลอกไฟล์เหล่านั้น

ฉันอยู่ภายใต้การแสดงผล-Rจะคัดลอกไฟล์ทั้งหมดซ้ำ ฉันจะบรรลุเป้าหมายดังกล่าวได้อย่างไร

คำตอบ:


19

ใช้:

find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;

เหตุผลสำหรับการคำสั่งของคุณไม่ได้ทำงานเป็นชื่อที่มีสัญลักษณ์ ( *.mp3) จะขยายตัวก่อนที่คำสั่งจะดำเนินการดังนั้นหากคุณมีสามไฟล์ ( 01.mp3, 02.mp3, 03.mp3) คำสั่งที่มีประสิทธิภาพของคุณคือ:

cp -R /media/kalenpw/MyBook/Music/01.mp3 /media/kalenpw/MyBook/Music/02.mp3 /media/kalenpw/MyBook/Music/03.mp3 /media/kalenpw/HDD/Music

อย่างที่คุณเห็น-Rไม่มีผลในกรณีนี้


ผมขอแนะนำให้-inameแทน-nameในกรณีที่ไฟล์ใด ๆ .MP3สิ้นสุดใน
โอเลเท

ขอบคุณสิ่งนี้ได้ผล หรืออย่างน้อยก็อยู่ในขั้นตอนการทำงาน
kalenpw

5

คุณได้กล่าวถึงไฟล์ / ไดเรกทอรี (IES) ที่จะคัดลอกโดยใช้*.mp3เช่นชื่อไฟล์ / ไดเรกทอรีใด ๆ ที่ลงท้าย.mp3ด้วย

ดังนั้นไฟล์ใด ๆ ที่ลงท้าย.mp3ใน/media/kalenpw/MyBook/Music/ไดเรกทอรีและในทำนองเดียวกันไดเรกทอรีใด ๆ ในตอนจบ.mp3ใน/media/kalenpw/MyBook/Music/จะถูกคัดลอกซ้ำ หากไม่มีไฟล์ / ไดเรกทอรีที่ตรงกันเช่นนั้นจะไม่มีการคัดลอกอะไรเลย

ตอนนี้เพื่อคัดลอก.mp3ไฟล์ทั้งหมดจาก/media/kalenpw/MyBook/Music/recursivley ไปยังไดเรกทอรี/media/kalenpw/HDD/Music/:

  • การใช้bash:

    shopt -s globstar
    cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
    
  • การใช้find:

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    

ขอบคุณ techraf ตอบก่อนดังนั้นฉันจึงยอมรับคำตอบของพวกเขา
kalenpw

1

คุณยังสามารถใช้cpr :

$ cd /media/kalenpw/HDD/Music
$ cpr -p '/\.mp3$/' '/media/kalenpw/MyBook/Music/'

โปรดทราบว่าหากไม่มี-p cprจะรักษาเส้นทางไดเรกทอรีทั้งหมดในชื่อไฟล์ที่คัดลอก
-rสามารถใช้ (แทน-p) เพื่อรักษาเส้นทางภายใต้ '/media.../Music/'
นอกจากนี้cprจะต้องระมัดระวังว่าไม่มีไฟล์ใดถูกเขียนทับซึ่งจะเพิ่มหมายเลขเริ่มต้นที่ '0001' ไปยังชื่อไฟล์ที่ถูกทำซ้ำ


1

สมมติว่าคุณมีพวงของ.docx, .mp3, .txtและ.xlsxไฟล์ที่เก็บไว้ในโครงสร้างไดเรกทอรีนี้:

/files/
/files/dir1/
/files/dir1/dir11/
/files/dir1/dir12/
/files/dir1/dir13/
/files/dir2/
/files/dir3/
/files/dir3/dir31/
/files/dir3/dir32/
/files/dir4/
/files/dir5/
/files/dir51/
/files/dir52/
/files/dir53/
/files/dir54/

... และคุณต้องการเรียกคืนไปยังไดเรกทอรีดังกล่าวทั้งหมดเพื่อคัดลอก.mp3ไฟล์ที่พบทั้งหมดไป/home/me/music/แต่คุณไม่ต้องการเก็บแผนผังไดเรกทอรีดังกล่าวในปลายทาง (เช่นคุณต้องการ.mp3ให้คัดลอกไฟล์ที่พบทั้งหมด/home/me/music/แทนที่จะคัดลอกไปยังไดเรกทอรีที่เกี่ยวข้อง เช่น/home/me/music/dir1/, /home/me/music/dir1/dir11/และอื่น ๆ )

ในกรณีเช่นนี้ที่เทอร์มินัลเชลล์ (ทุบตี) ให้รันคำสั่งนี้ก่อนเพื่อเข้าถึงรูทของการค้นหาไฟล์ของคุณ:

cd /files

... แล้วเรียกใช้คำสั่งนี้:

for i in `find . -iname '*.mp3'`; do cp $i /home/me/music/; done

ในกรณีที่คุณไม่ต้องการที่จะรักษาต้นไม้ไดเรกทอรีแหล่งที่มาในปลายทางเรียกใช้คำสั่งนี้แทน (หลังจากทำงานcd /files):

find . -iname '*.mp3' | cpio -pdm /home/me/music/

คำสั่งดังกล่าวข้างต้นการค้นหาเป็นกรณีตาย (เช่นไม้ขีดไฟ.mp3, .MP3, .mP3และ.Mp3) ใช้-nameแทน-inameถ้าคุณต้องการค้นหาเพื่อเป็นกรณี ๆ ไป (เช่นใช้-nameสำหรับ.mp3สายอักขระจะตรงกับไฟล์ที่ลงท้ายด้วย.mp3แต่ไม่ใช่ผู้ที่ลงท้ายด้วย.MP3, .mP3มิได้.Mp3)


สำหรับกรณีที่คุณต้องการรักษาโครงสร้างไดเรกทอรีให้เรียกใช้คำสั่งนี้จากไดเรกทอรีต้นทาง หากคุณเรียกใช้find /source/dir -iname '*.mp3' | cpio -pdm /home/me/music/มันจะสร้าง / home / me / music / source / dir และไฟล์จะถูกคัดลอกไปยังตำแหน่งใหม่นี้
Gautam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.