คำสั่ง cp เพื่อแยกไฟล์บางไฟล์จากการคัดลอก


คำตอบ:


57

การใช้rsync:

rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

โปรดทราบว่าการใช้sourceและsource/แตกต่างกัน ต่อท้ายเฉือนหมายถึงการคัดลอกเนื้อหาของโฟลเดอร์เข้าsource โดยไม่ต้องเฉือนท้ายหมายถึงมันคัดลอกแหล่งโฟลเดอร์destinationdestination

อีกวิธีหนึ่งถ้าคุณมีไดเรกทอรี (หรือไฟล์) จำนวนมากที่จะแยกออกคุณสามารถใช้--exclude-from=FILEโดยที่FILEชื่อของไฟล์ที่มีไฟล์หรือไดเรกทอรีที่จะแยกออก

--exclude อาจมีอักขระตัวแทนเช่น --exclude=*/.svn*

คัดลอกจาก: https://stackoverflow.com/a/2194500/749232

หากคุณต้องการใช้cpตัวเอง:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

สิ่งนี้ถือว่าโครงสร้างไดเรกทอรีเป้าหมายเหมือนกับของแหล่งที่มา

คัดลอกจาก: https://stackoverflow.com/a/4586025/749232


3

มาถึงช่วงท้ายเกม แต่นี่เป็นวิธีการแก้ปัญหาที่แตกต่างกันมากโดยใช้ bash และ cp ธรรมดา: คุณสามารถใช้สเปคไฟล์ทั่วโลกในขณะที่บางไฟล์ถูกละเว้น

สมมติว่าไดเรกทอรีมีไฟล์:

$ ls *
listed1  listed2  listed3  listed4  unlisted1  unlisted2  unlisted3

ใช้ ตัวแปรGLOBIGNORE :

$ export GLOBIGNORE='unlisted*'
$ ls *
listed1  listed2  listed3  listed4

หรือด้วยการยกเว้นที่เฉพาะเจาะจงมากขึ้น:

$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1  listed2  listed3  listed4  unlisted3

หรือใช้การจับคู่เชิงลบ :

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

สิ่งนี้ยังสนับสนุนรูปแบบที่ไม่ตรงกันหลายรูปแบบ:

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3

1
สำหรับการจับคู่เชิงลบคุณต้องเปิดใช้งาน globs แบบขยาย: shopt -s extglobนอกจากนี้คุณไม่จำเป็นต้องส่งออกGLOBIGNORE: มันควรจะปรับเปลี่ยนพฤติกรรมของเชลล์ปัจจุบันโปรแกรมลูกส่วนใหญ่ไม่สนใจ
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.