ค้นหาและคัดลอกไฟล์


128

เหตุใดสิ่งต่อไปนี้จึงไม่คัดลอกไฟล์ไปยังโฟลเดอร์ปลายทาง

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'

คำตอบ:


273

หากคุณตั้งใจจะคัดลอกไฟล์ที่พบไปยัง / home / shantanu / tosend คุณมีลำดับของอาร์กิวเมนต์ที่จะ cp ย้อนกลับ:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

หมายเหตุ: ค้นหาคำสั่งใช้{}เป็นตัวยึดสำหรับไฟล์ที่ตรงกัน


15
มีจุดประสงค์เพื่อ\;อะไร?
Astrid

5
@Astrid ตรวจสอบสิ่งนี้
shellbye

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;คำสั่งนี้มีอะไรผิดปกติหรือไม่? มันไม่ทำงาน
mrid

2
ใช้ไม่ได้หากผลลัพธ์มีช่องว่างในเส้นทาง ข้อเสนอแนะสำหรับสิ่งนี้หรือไม่?
TheJeff

1
ใน Ubuntu 18 จะต้องใส่เครื่องหมายปีกกาลงในเครื่องหมายคำพูดเดี่ยว: ค้นหา -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo

32

ฉันประสบปัญหาเช่นนี้ ...

จริงๆแล้วคุณสามารถประมวลfindผลเอาต์พุตcopyคำสั่งในคำสั่งได้สองวิธี

  1. หากfindเอาต์พุตของคำสั่งไม่มีช่องว่างเช่นถ้าชื่อไฟล์ไม่มีที่ว่างคุณสามารถใช้คำสั่งที่กล่าวถึงด้านล่าง:

    ไวยากรณ์: find <Path> <Conditions> | xargs cp -t <copy file path>

    ตัวอย่าง: find -mtime -1 -type f | xargs cp -t inner/

  2. แต่ส่วนใหญ่แล้วไฟล์ข้อมูลการผลิตของเราอาจมีที่ว่างอยู่ในนั้น เวลาส่วนใหญ่คำสั่งที่กล่าวถึงด้านล่างจึงปลอดภัยกว่า:

    ไวยากรณ์: find <path> <condition> -exec cp '{}' <copy path> \;

    ตัวอย่าง find -mtime -1 -type f -exec cp '{}' inner/ \;

ในตัวอย่างที่สองส่วนสุดท้ายเช่นเซมิโคลอนก็ถือเป็นส่วนหนึ่งของfindคำสั่งเช่นกันซึ่งควรจะใช้ Escape ก่อนกดปุ่ม Enter มิฉะนั้นคุณจะได้รับข้อผิดพลาดเช่นนี้

find: missing argument to `-exec'

ในกรณีของคุณคัดลอกไวยากรณ์คำสั่งที่ไม่ถูกต้อง/home/shantanu/tosendในการคัดลอกไฟล์พบลงใน คำสั่งต่อไปนี้จะทำงาน:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;

3. ถ้าคุณมี GNU find/ ,xargs find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>ตัวอย่าง:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight

7

คุณต้องใช้cp -t /home/shantanu/tosendเพื่อบอกว่าอาร์กิวเมนต์เป็นไดเร็กทอรีเป้าหมายไม่ใช่แหล่งที่มา จากนั้นคุณสามารถเปลี่ยนเป็น-exec ... +เพื่อcpคัดลอกไฟล์ให้ได้มากที่สุดในคราวเดียว


2
ใน linux ต้องระบุไดเร็กทอรีเป้าหมายดังนี้ find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM

3
คำตอบนี้สามารถปรับปรุงและทำให้สั้นลงได้หากมีการให้คำสั่งที่สมบูรณ์เหมือนในคำตอบด้านบน
Brian


-2

สาเหตุของข้อผิดพลาดนั้นคือคุณพยายามคัดลอกโฟลเดอร์ที่ต้องใช้ตัวเลือก -r เพื่อ cp ขอบคุณ


3
สวัสดีเนื่องจากคำถามได้รับคำตอบแล้ว (จากที่ผ่านมา) นี่ไม่ใช่คำตอบที่เกี่ยวข้องจริงๆจึงควรเป็นความคิดเห็น (เมื่อคุณมีตัวแทนเพิ่มเติม) เว้นแต่คุณต้องการที่จะขยายและอธิบาย เพียงแค่หัวขึ้น :)
W1ll1amvl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.