สร้าง tar เก็บถาวรของไดเรกทอรียกเว้นไฟล์ที่ซ่อนอยู่?


17

ฉันต้องการสร้างไฟล์เก็บถาวร tar ของไดเรกทอรีเฉพาะ (พร้อมไดเรกทอรีย่อยของหลักสูตร) แต่เมื่อฉันทำโดยใช้คำสั่ง tar ฉันได้รับรายชื่อของไฟล์ที่รวมอยู่เช่น:

calendar_final /._ style.css

calendar_final / style.css

อย่างที่คุณเห็นมีไฟล์เดียวกันสองเวอร์ชัน สิ่งนี้ไปสำหรับทุกไฟล์และมีมากมาย ฉันจะแยกไฟล์ชั่วคราวด้วยคำนำหน้า. _ ออกจากไฟล์เก็บถาวร tar ได้อย่างไร


สิ่งนี้อาจช่วยได้: unix.stackexchange.com/questions/2213/…
tshepang

ไฟล์เหล่านี้ไม่ใช่ไฟล์ชั่วคราว แต่เป็นตัวแทนของข้อมูลเมตาของระบบไฟล์ OS X (หากฉันไม่ได้เข้าใจผิดพวกมันรวมถึงป้ายกำกับ Finder, ประเภทและรหัสผู้สร้าง, คุณสมบัติเพิ่มเติม ฯลฯ ) ไฟล์เหล่านี้ไม่มีอยู่ก่อนสร้าง tar บน OS X คำตอบที่เป็นไปได้ขึ้นอยู่กับว่าคุณอยู่ใน OS X / HFS + หรือระบบอื่น
Daniel Beck

คำตอบ:


33

คุณโพสต์ในความคิดเห็นที่คุณกำลังทำงานกับระบบ Mac OS X นี่เป็นเบาะแสสำคัญสำหรับวัตถุประสงค์ของ._*ไฟล์เหล่านี้

._*รายการเก็บถาวรเหล่านี้เป็นกลุ่มของข้อมูลAppleDoubleที่มีข้อมูลเพิ่มเติมที่เกี่ยวข้องกับไฟล์ที่เกี่ยวข้อง (รายการที่ไม่มี._คำนำหน้า) มันถูกสร้างขึ้นโดยฟังก์ชั่นเฉพาะของcopyfile (3)ตระกูลMac OS X AppleDouble blobs จัดเก็บข้อมูลการควบคุมการเข้าถึง (ACLs) และแอ็ตทริบิวต์ส่วนขยาย (โดยทั่วไปคือตัวค้นหาธงและ "ทรัพยากรส้อม" แต่ xattrs สามารถใช้เพื่อจัดเก็บข้อมูลชนิดใดก็ได้)

ระบบจัด Mac OS X เก็บเครื่องมือ ( bsdtar(ยังเป็น symlinked tar) gnutarและpax) จะสร้าง._*สมาชิกเก็บไฟล์ใด ๆ ที่มีข้อมูลการขยายใด ๆ ที่เกี่ยวข้องกับมัน ในโหมด "unarchive" พวกเขาจะถอดรหัสสมาชิกไฟล์เก็บถาวรเหล่านั้นและนำข้อมูลส่วนขยายไปใช้กับไฟล์ที่เกี่ยวข้อง สิ่งนี้จะสร้างไฟล์เก็บถาวร“ full fidelity” สำหรับใช้กับระบบ Mac OS X โดยการรักษาและแยกข้อมูลทั้งหมดที่ระบบไฟล์ HFS + สามารถจัดเก็บได้ในภายหลัง

เครื่องมือเก็บถาวรที่สอดคล้องกันในระบบอื่น ๆ ไม่ทราบว่าจะให้การจัดการพิเศษกับ._*ไฟล์เหล่านี้ดังนั้นพวกเขาจะแตกไฟล์เป็นไฟล์ปกติ เนื่องจากไฟล์ดังกล่าวค่อนข้างไร้ประโยชน์ในระบบอื่นจึงมักถูกมองว่าเป็น "ไฟล์ขยะ" ตามลําดับหากระบบที่ไม่ใช่ Mac OS X สร้างไฟล์เก็บถาวรที่มีไฟล์ปกติที่เริ่มต้นด้วย._เครื่องมือยกเลิกการเก็บถาวร Mac OS X จะพยายามถอดรหัสไฟล์เหล่านั้นเป็นข้อมูลเพิ่มเติม

อย่างไรก็ตามมีวิธีการที่ไม่มีเอกสารประกอบ (?) ในการทำให้ระบบจัดเก็บข้อมูล Mac OS X ที่ระบบจัดทำนั้นทำงานเหมือนในระบบ Unixy อื่น ๆ : ตัวแปรสภาพแวดล้อม COPYFILE_DISABLE การตั้งค่าตัวแปรนี้ (เป็นค่าใด ๆ แม้แต่สตริงว่าง) จะป้องกันผู้จัดเก็บจากการสร้าง._*สมาชิกไฟล์เก็บถาวรเพื่อแสดงข้อมูลเพิ่มเติมที่เกี่ยวข้องกับไฟล์ที่เก็บถาวร การปรากฏตัวของมันจะช่วยป้องกันไม่ให้ผู้จัดเก็บพยายามตีความสมาชิกที่เก็บถาวรเช่นข้อมูลเพิ่มเติม

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

คุณอาจตั้งค่าตัวแปรนี้ในไฟล์เริ่มต้นของเชลล์ถ้าคุณต้องการทำงานแบบนี้บ่อยกว่าไม่

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

จากนั้นเมื่อคุณต้องการเปิดใช้งานคุณลักษณะอีกครั้ง (เพื่อรักษา / กู้คืนข้อมูลเพิ่มเติม) คุณสามารถ“ ยกเลิกการตั้งค่า” ตัวแปรสำหรับแต่ละคำสั่ง:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

ผู้จัดเก็บใน Mac OS X 10.4 ก็ทำสิ่งที่คล้ายกันแม้ว่าพวกเขาจะใช้ตัวแปรสภาพแวดล้อมที่แตกต่างกัน: COPY_EXTENDED_ATTRIBUTES_DISABLE


มีใครเห็นสิ่งนี้ไม่ทำงาน? ฉันได้ลองใช้วิธีแก้ปัญหานี้ใน Yosemite แล้วและเมื่อฉันเปิดเครื่องรูดบนกล่อง AIX ไดเรกทอรี PaxHeader จะยังคงถูกสร้างขึ้น
conorgriffin

5

สิ่งนี้น่าจะใช้ได้:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

ฉันคิดว่ามันใช้งานได้ แต่จริง ๆ แล้วเมื่อฉันแกะที่เก็บถาวรฉันพบว่าพวกเขารวม: /

แปลกคุณใช้ tar เวอร์ชั่นไหน? tar --versionให้ GNU 1.23 ที่นี่
Frederik Deweerdt

1
ไฟล์เหล่านั้นเป็นข้อมูลเมตาของระบบไฟล์บน OS X และไม่มีอยู่ก่อนที่จะรัน tar ดังนั้นอาจไม่สามารถแยกได้ด้วยวิธีนี้ ข้อมูลเหล่านี้รวมอยู่ในการอนุญาตให้กู้คืนข้อมูลเมตาของไฟล์ OS X เมื่อคลายการจัดเก็บลงสื่อถาวรบน Mac เครื่องอื่น
Daniel Beck

ได้ผลสำหรับฉัน ฉันแนะนำให้ใช้tar vzcf ...เพื่อดูว่ามีไฟล์ใด ๆ ที่ไม่ถูกต้องรวมอยู่ด้วยหรือไม่
stribika

@stribika เขามีแนวโน้มมากที่สุดใน OS X ดูความคิดเห็นของฉันในคำถาม ไม่สามารถแยกไฟล์ได้เนื่องจากไม่มีอยู่นอกไฟล์เก็บถาวร tar
Daniel Beck

2

Frederik Deweerdtได้มอบโซลูชันที่ทำงานบน GNU tar (ใช้กับ Linux, Cygwin, FreeBSD, OSX, อาจเป็นแบบอื่น) แต่ไม่ใช่ในระบบอื่นเช่น NetBSD, OpenBSD หรือ Solaris

POSIX ไม่ได้ระบุtarคำสั่ง (เพราะจะแตกต่างกันมากเกินไประหว่างตัวแปร unix) และแนะนำpaxคำสั่งแทน ตัวเลือก-wหมายถึงการสร้างไฟล์เก็บถาวร ( -rแยก) และ-xเลือกรูปแบบไฟล์เก็บถาวร ตัวเลือก-s '!BRE!!'ไม่รวมไฟล์ทั้งหมดที่มีพา ธ ตรงกับนิพจน์ทั่วไปพื้นฐาน BRE

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

น่าสนใจ ... ฉันไม่รู้เกี่ยวกับสันติภาพ
เกบ

2

ตั้งแต่bsdtar 3.0.3 - libarchive 3.0.3(และก่อนหน้านี้) มีตัวเลือกใหม่ (เฉพาะ Mac OS X) สำหรับbsdtarคำสั่งที่เรียกว่า--disable-copyfileเพื่อไม่ให้มีการสร้าง._ไฟล์ เวอร์ชันเก่ากว่าtarไม่มี--disable-copyfileตัวเลือก แต่การตั้งค่าตัวแปรสภาพแวดล้อมCOPYFILE_DISABLE=1ควรใช้งานได้


ด้วยbsdtar 2.8.3 - libarchive 2.8.3ของไม่ได้รับการบันทึกไว้ แต่กระนั้นใช้ได้ 10.7.5--disable-copyfile
Stefan Schmidt

0

ทำตามขั้นตอนเหล่านี้:

  1. ค้นหา._ไฟล์ทั้งหมดและแสดงรายการโดยใช้-lsเพื่อให้คุณสามารถดู._ไฟล์ทั้งหมดและลบออกในที่สุด

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. สร้างไฟล์เก็บถาวร. tar โดยใช้

    tar -cvf name.tar /path/to/directory
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.