ทำไมคำสั่ง GNU Coreutils ถึงมี-T/--no-target-directory
ตัวเลือก? ดูเหมือนว่าทุกอย่างที่ทำได้สามารถทำได้โดยใช้ซีแมนทิกส์ของ.
(จุดตัวเอง) ในลำดับชั้นไดเรกทอรี Unix แบบดั้งเดิม
พิจารณา:
cp -rT /this/source dir
-T
ตัวเลือกที่จะช่วยป้องกันการคัดลอกจากการสร้างdir/source
ไดเรกทอรีย่อย ค่อนข้าง/this/source
จะถูกระบุด้วยdir
และเนื้อหาจะถูกแมประหว่างต้นไม้ตามลำดับ ดังนั้นสำหรับตัวอย่างเช่น/this/source/foo.c
ไปdir/foo.c
และอื่น ๆ dir/source/foo.c
มากกว่าที่จะ
แต่สามารถทำได้อย่างง่ายดายโดยไม่ต้อง-T
ใช้ตัวเลือก:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
ความหมายองค์ประกอบจุดต่อท้ายจะถูกคัดลอกเป็นเด็กของdir
แต่แน่นอนว่า "เด็ก" ที่มีอยู่แล้ว (เพื่อไม่ต้องถูกสร้างขึ้น) และเป็นจริงdir
ตัวเองเพื่อให้ผลเป็นที่ยึดติดกับ/this/path
dir
มันทำงานได้ดีถ้าไดเรกทอรีปัจจุบันเป็นเป้าหมาย:
cp -r /this/tree/node/. . # node's children go to current dir
มีบางสิ่งที่คุณสามารถทำได้ด้วยสิ่งเดียว-T
ที่ทำให้การดำรงอยู่ของมันมีเหตุผล? (นอกจากการรองรับระบบปฏิบัติการที่ไม่ได้ใช้งานไดเรกทอรีดอทแล้วเหตุผลที่ไม่ได้กล่าวถึงในเอกสาร)
เคล็ดลับจุดด้านบนไม่สามารถแก้ไขสภาพการแข่งขันเดียวกันกับที่กล่าวไว้ในเอกสาร GNU Info ได้-T
หรือไม่?
.
เคล็ดลับไม่ทำงานเมื่อคัดลอกไฟล์เพียงแค่ไม่ได้เมื่อเปลี่ยนชื่อ basename ในเวลาเดียวกัน!cp /path/to/file /target/dir/.
หาก/target/dir/file
มีอยู่และเป็นไดเรกทอรีคุณจะได้รับการวินิจฉัยเหมือนกัน! แต่คุณได้แสดงให้เห็นแล้วว่าสิ่ง-T
ใดที่ไม่สามารถทำได้หากไม่มีมันในขั้นตอนเดียวโดยไม่มีเงื่อนไขการแข่งขัน: คัดลอกไฟล์และเปลี่ยนชื่อโดยไม่ถูกแบ่งเป็นไดเรกทอรีย่อย