มีวิธีใช้คำสั่ง 'cp' เพื่อคัดลอกไดเรกทอรีและยกเว้นบางไฟล์ / ไดเรกทอรีย่อยภายในหรือไม่
มีวิธีใช้คำสั่ง 'cp' เพื่อคัดลอกไดเรกทอรีและยกเว้นบางไฟล์ / ไดเรกทอรีย่อยภายในหรือไม่
คำตอบ:
การใช้rsync
:
rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
โปรดทราบว่าการใช้source
และsource/
แตกต่างกัน ต่อท้ายเฉือนหมายถึงการคัดลอกเนื้อหาของโฟลเดอร์เข้าsource
โดยไม่ต้องเฉือนท้ายหมายถึงมันคัดลอกแหล่งโฟลเดอร์destination
destination
อีกวิธีหนึ่งถ้าคุณมีไดเรกทอรี (หรือไฟล์) จำนวนมากที่จะแยกออกคุณสามารถใช้--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
มาถึงช่วงท้ายเกม แต่นี่เป็นวิธีการแก้ปัญหาที่แตกต่างกันมากโดยใช้ 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
shopt -s extglob
นอกจากนี้คุณไม่จำเป็นต้องส่งออกGLOBIGNORE
: มันควรจะปรับเปลี่ยนพฤติกรรมของเชลล์ปัจจุบันโปรแกรมลูกส่วนใหญ่ไม่สนใจ