เมื่อฉัน tar ไฟล์บางไฟล์ใน OS X:
tar cvf foo.tar foo
มันสร้างไฟล์พิเศษ._foo
ใน tarball:
./._foo
foo
ซึ่งจะปรากฏขึ้นถ้าฉันแยกมันบนระบบปฏิบัติการที่ไม่ใช่ Mac แต่._foo
ไม่มีอยู่ในระบบไฟล์ของฉัน! เกิดอะไรขึ้น? ฉันจะกำจัดมันได้อย่างไร
เมื่อฉัน tar ไฟล์บางไฟล์ใน OS X:
tar cvf foo.tar foo
มันสร้างไฟล์พิเศษ._foo
ใน tarball:
./._foo
foo
ซึ่งจะปรากฏขึ้นถ้าฉันแยกมันบนระบบปฏิบัติการที่ไม่ใช่ Mac แต่._foo
ไม่มีอยู่ในระบบไฟล์ของฉัน! เกิดอะไรขึ้น? ฉันจะกำจัดมันได้อย่างไร
คำตอบ:
tar ของ OS X ใช้รูปแบบ AppleDouble เพื่อจัดเก็บแอตทริบิวต์เพิ่มเติมและ ACL
$ touch file1 file2 file3
$ xattr -w key value file1
$ chmod +a 'admin allow delete' file2
$ ls -le@ *
-rw-r--r--@ 1 lauri staff 0 May 25 07:09 file1
key 5
-rw-r--r--+ 1 lauri staff 0 May 25 07:09 file2
0: group:admin allow delete
-rw-r--r-- 1 lauri staff 0 May 25 07:09 file3
$ tar -cf 1.tar *
$ tar -tf 1.tar
./._file1
file1
./._file2
file2
file3
tar ของ OS X ยังรู้วิธีการแปลงสมาชิก. _ กลับเป็นฟอร์แมทเนทีฟ แต่ไฟล์. _ มักถูกเก็บไว้เมื่อทำการแตกไฟล์เก็บถาวรบนแพลตฟอร์มอื่น คุณสามารถบอก tar ไม่ให้รวมข้อมูลเมตาได้ด้วยการตั้งค่า COPYFILE_DISABLE ให้เป็นค่าบางส่วน:
$ COPYFILE_DISABLE=1 tar -cf 2.tar file*
$ tar -tf 2.tar
file1
file2
file3
man copyfile
ls -l@
แสดงให้เห็นถึงปุ่มและขนาดของคุณสมบัติเพิ่มเติมls -le
พิมพ์ ACLxattr -l
แสดงรายการคีย์และค่าของคุณสมบัติเพิ่มเติมxattr -c
ล้างแอตทริบิวต์เพิ่มเติมทั้งหมด (-d ไม่สามารถใช้คนเดียว)chmod -N
ลบ ACLsข้อมูลที่เก็บไว้เป็นคุณลักษณะเพิ่มเติม:
env COPYFILE_DISABLE tar -cf archive.tar my_folder/
แทนการส่งออกตัวแปรนี้ไปทั้งระบบคุณยังสามารถใช้
cat
หรือtype
ดูว่ามีอะไรอยู่ข้างในอย่างน้อยที่สุด และมักเป็นข้อความธรรมดาที่ป้อนด้วยตนเองที่นั่น ฉันจะไม่ทิ้งมันไปเพื่อสำรอง แต่มันอาจเป็นถังขยะในกรณีที่คุณต้องการแจกจ่ายบางสิ่งบางอย่างข้ามแพลตฟอร์มและโดยเฉพาะอย่างยิ่งถ้ามันมีโดยไม่ตั้งใจ เพียงแค่พูดว่าตัวเลือกที่จะปล่อยให้พวกเขานั้นถูกต้องสวย
ตั้งแต่bsdtar 3.0.3 - libarchive 3.0.3
(และก่อนหน้านี้) มีตัวเลือกใหม่สำหรับbsdtar
คำสั่งที่เรียกว่า--disable-copyfile
เพื่อไม่ให้มีการสร้าง._
ไฟล์
# on Mac OS X
# /usr/bin/tar -> bsdtar
ls -l /usr/bin/tar
# from man bsdtar
--disable-copyfile
Mac OS X specific. Disable the use of copyfile(3).
bsdtar 2.8.3 - libarchive 2.8.3
ของไม่ได้รับการบันทึกไว้ แต่กระนั้นใช้ได้ 10.7.5
--disable-copyfile
._
ไฟล์ส้อมทรัพยากรดังกล่าวในคำตอบอื่น ๆ อย่างไรก็ตามมีวิธีที่ดีกว่าในการกำจัดพวกเขาเมื่อใช้tar
:
export COPYFILE_DISABLE=true
tar cvf foo.tar foo
นอกจากนี้ยังมีdot_clean
ยูทิลิตี้สำหรับทำความสะอาดไฟล์เหล่านี้ (ฉันคิดว่ามันมักจะใช้สำหรับการจัดเก็บข้อมูลภายนอก)
นี่คือสคริปต์ python สำหรับการลบไฟล์เหล่านั้น ควรทำงานในระบบปฏิบัติการยอดนิยมใด ๆ
ไม่ผ่านการทดสอบอย่างละเอียดให้ใช้ความเสี่ยงของคุณเอง!
import os
import os.path
def dot_clean(folder):
files = os.listdir(folder)
for file in files:
full_name = folder + "/" + file
if os.path.isdir(full_name):
dot_clean(full_name)
elif file.startswith("._"):
os.remove(full_name)
dot_clean('.')
อักขระจุด "." ถูกใช้บนแพลตฟอร์ม Mac เป็นตัวบ่งชี้ไฟล์ที่ซ่อนอยู่ สำหรับ Windows เป็นตัวอักษร "$" อย่างไรก็ตามไฟล์. _foo นั้นอาจมีข้อมูลเฉพาะของ OS X อยู่และฉันขอแนะนำให้ไม่ลบมัน ในระบบอื่นคุณจะต้องไม่สนใจมันหรือบางคนที่นี่อาจสามารถจัดเตรียมสคริปต์ที่จะซ่อนไฟล์และโฟลเดอร์ที่ขึ้นต้นด้วย "."