ดังนั้นคุณสามารถใช้*
เป็นบัตรเสริมสำหรับไฟล์ทั้งหมดเมื่อใช้cp
ภายในบริบทของไดเรกทอรี มีวิธีการคัดลอกไฟล์ทั้งหมดยกเว้นx
ไฟล์หรือไม่
ดังนั้นคุณสามารถใช้*
เป็นบัตรเสริมสำหรับไฟล์ทั้งหมดเมื่อใช้cp
ภายในบริบทของไดเรกทอรี มีวิธีการคัดลอกไฟล์ทั้งหมดยกเว้นx
ไฟล์หรือไม่
คำตอบ:
ในbash
คุณสามารถใช้extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
โดย!(b*)
ไม่รวมb*
ไฟล์ทั้งหมด
คุณสามารถปิดการใช้งานในภายหลังextglob
ด้วย
$ shopt -u extglob
find
เป็นวิธีเดียวในtcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync จัดการอย่างนี้
ตัวอย่างคัดลอกทั้งหมด: rsync -aP /folder1/* /folder/2
ตัวอย่างการคัดลอกทั้งหมดยกเว้น: rsync -aP --exclude=x /folder1/* /folder2/
-aP
สวิทช์:
a: คล้ายกับcp -a
เวียนเกิดซ้ำเป็นต้น P: แสดงความคืบหน้าคุณสมบัติที่ดีของ rsync
-rP
แทน-aP
ถ้าคุณต้องการเรียกคืน -a
สำหรับการเก็บถาวร ไม่แน่ใจว่าสิ่งนี้มีการเปลี่ยนแปลงหรือไม่หรือแตกต่างจาก MacOS
rsync
ไม่มีตัวเลือกเพื่อให้สามารถเรียกซ้ำได้ ตัวอย่าง: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (ผ่านการทดสอบบน Ubuntu เท่านั้น)
นี่ไม่ใช่คุณสมบัติของcp
มันเป็นคุณสมบัติของเชลล์ของคุณ (ขยาย*
เพื่อหมายถึงไฟล์ที่ไม่ใช่จุดทั้งหมด) ดังนั้นคำตอบขึ้นอยู่กับเชลล์ที่คุณใช้ ตัวอย่างเช่นzsh
รองรับไวยากรณ์นี้:
$ cp ^x /path/to/destination
ที่ไหน^x
"ไฟล์ทั้งหมดยกเว้นx
" ในกรณีที่
คุณสามารถรวมรูปแบบการเลือกและการยกเลิกการเลือกเช่นเพื่อคัดลอกไฟล์ wav ทั้งหมดยกเว้นที่มี xyz คุณสามารถใช้:
cp *.wav~*xyz*
bash
?
นอกจากนี้ยังสามารถทำได้ในเปลือก bourne แบบเก่า (แบบพกพา / ใช้งานร่วมกันได้) ในหลากหลายวิธีด้วยเครื่องมือมาตรฐานในรูปแบบที่หรูหราน้อยกว่าการใช้เชลล์แบบกลมหรือคำสั่งเชลล์ขั้นสูงที่มีตัวเลือกในการยกเว้น
หากมีไฟล์ไม่มากเกินไป (และไม่มีชื่อรวมถึงช่องว่างและ / หรือ linebreaks) อาจเป็นวิธี:
cp `ls | egrep -v '^excludename$'` destdir/.
แน่นอนbash
และเครื่องมือของ GNU นั้นยอดเยี่ยมและทรงพลัง แต่ก็ยังไม่พร้อมเสมอ หากคุณตั้งใจจะใส่ไว้ในสคริปต์พกพาฉันอยากจะแนะนำfind
ในความคิดเห็นโดย Rush
หากคุณต้องการคัดลอกทุกสิ่งในโฟลเดอร์ (รวมถึงโฟลเดอร์ย่อย) ไปยังไดเรกทอรีย่อยเฉพาะ:
cp -R $(ls | grep -v '^subdir$') subdir/
ใช้งานได้กับ sh, bash, zsh (อย่างน้อย)
cp -R * subdir/
cp
(ไม่ใช่จากbash
/ sh
), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
" แม้ว่าการทำสำเนาจะเสร็จสมบูรณ์อย่างถูกต้อง โชคไม่ดีที่ตัวแปรของคุณหยุดพักด้วยชื่อไฟล์ใด ๆ ที่มีช่องว่างหรือเครื่องหมายวรรคตอนที่อ่อนไหวต่อเชลล์ ดูunix.stackexchange.com/q/128985/135943
extglob
เป็นวิธีที่ดีที่สุดที่ฉันคาดเดา
อีกวิธีคือการใช้
cp $(ls --ignore=x) subdir/
$
ฯลฯ ) ls
ไม่เคยแยกการส่งออกของ unix.stackexchange.com/q/128985/135943