POSIXly คุณจะใช้pax
ในโหมดอ่าน + เขียนพร้อม-l
ตัวเลือก:
pax -rwlpe -s /A/B/ dirA .
( -pe
เก็บรักษาคุณลักษณะทั้งหมดเป็นไปได้ของไฟล์ (ในกรณีนี้ไดเรกทอรีเท่านั้น) ที่มีการคัดลอกเช่น GNU cp
's -a
ไม่)
ตอนนี้แม้ว่ามาตรฐานคำสั่งที่ไม่จำเป็นต้องมากแบบพกพา
เริ่มแรกระบบที่ใช้ GNU / Linux หลายระบบไม่ได้รวมอยู่ในpax
ค่าเริ่มต้น (แม้ว่าจะเป็นโปรแกรมอรรถประโยชน์ POSIX ที่ไม่ใช่ตัวเลือกก็ตาม)
จากนั้นจำนวนข้อบกพร่องและการไม่สอดคล้องกับการใช้งานไม่กี่ครั้งทำให้เกิดปัญหาจำนวนหนึ่งกับรหัสนั้น
- เนื่องจากข้อผิดพลาด, Solaris 10
pax
(อย่างน้อย) ไม่ทำงานเมื่อใช้ร่วมกับ-rwl
-s
ด้วยเหตุผลบางอย่างดูเหมือนว่าจะใช้การทดแทนกับทั้งเส้นทางเดิมและเส้นทางที่คัดลอก ดังนั้นข้างต้นก็จะพยายามที่จะทำบางอย่างแทนlink("dirB/file", "dirB/file")
link("dirA/file", "dirB/file")
- บน FreeBSD
pax
อย่าสร้างฮาร์ดลิงก์สำหรับไฟล์ประเภทsymlink (พฤติกรรมที่อนุญาตโดย POSIX) ไม่เพียงแค่นั้น แต่ยังใช้การทดแทนกับเป้าหมายของ symlink (พฤติกรรมที่ไม่ได้รับอนุญาตจาก POSIX) ดังนั้นสำหรับตัวอย่างเช่นถ้ามีfoo -> AA
symlink ในdirA
ก็จะกลายเป็นในfoo -> BA
dirB
นอกจากนี้หากคุณต้องการทำสิ่งเดียวกัน แต่มีเส้นทางของไฟล์ที่มีเนื้อหาจัดเก็บอยู่$src
และ$dst
สิ่งสำคัญคือการตระหนักว่าการpax -rwl -- "$src" "$dst"
สร้างโครงสร้างไดเรกทอรีแบบเต็มของ$src
ภายใน$dst
(ต้องมีอยู่และเป็นไดเรกทอรี) ตัวอย่างเช่นถ้า$src
เป็นfoo/bar
แล้ว$dst/foo/bar
จะถูกสร้างขึ้น
หากคุณต้องการ$dst
เป็นสำเนาของ$src
สิ่งที่ง่ายที่สุดน่าจะเป็น:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(ซึ่งจะแก้ไขปัญหาส่วนใหญ่ที่กล่าวถึงข้างต้น แต่จะล้มเหลวหากเส้นทางที่แน่นอนของการ$dst
สิ้นสุดในตัวละครขึ้นบรรทัดใหม่)
ตอนนี้ที่จะไม่ช่วยในระบบ GNU / Linux pax
ที่ไม่มี
เป็นที่น่าสนใจที่จะทราบว่าpax
สร้างโดย POSIX เพื่อรวมคุณสมบัติของtar
และcpio
คำสั่ง
cpio
เป็นประวัติศาสตร์คำสั่ง Unix (จาก 1977) เมื่อเทียบกับการประดิษฐ์ POSIX และมีการดำเนินงานของกนูเช่นกัน (ไม่ได้เป็นpax
อย่างใดอย่างหนึ่ง) ดังนั้นแม้ว่ามันจะไม่ได้เป็นคำสั่งมาตรฐานอีกต่อไป(มันอยู่ใน SUSv2) แต่มันก็ยังเป็นเรื่องธรรมดามากและมีชุดคุณสมบัติหลักที่คุณสามารถพึ่งพาได้
เทียบเท่าจะเป็นpax -rwl
cpio -pl
อย่างไรก็ตาม:
cpio
รับรายการอินพุตไฟล์บน stdin ซึ่งต่างกับอาร์กิวเมนต์ (ตัวคั่น newline ซึ่งหมายความว่าไม่สนับสนุนชื่อไฟล์ที่มีอักขระบรรทัดใหม่)
- ไฟล์ทั้งหมดจะต้องมีการระบุ (โดยทั่วไปคุณฟีดมันเอาท์พุทของ
find
( find
และcpio
ได้รับการพัฒนาร่วมกันโดยคนเดียวกัน))
- ข้อมูลเมตาไม่ได้รับการเก็บรักษาไว้ (
cpio
การใช้งานบางอย่างมีตัวเลือกในการรักษาบางอย่าง แต่ไม่มีอะไรพกพาได้)
ดังนั้นด้วยcpio
:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
pax
กับ FreeBSDcp -a
ไม่ได้เชื่อมโยงไปยังฮาร์ดลิงก์