ดังนั้นคุณสามารถใช้*เป็นบัตรเสริมสำหรับไฟล์ทั้งหมดเมื่อใช้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