เหตุใดฉันจึงได้รับไฟล์เช่น. _foo ใน tarball ของฉันบน OS X


70

เมื่อฉัน tar ไฟล์บางไฟล์ใน OS X:

tar cvf foo.tar foo

มันสร้างไฟล์พิเศษ._fooใน tarball:

./._foo
foo

ซึ่งจะปรากฏขึ้นถ้าฉันแยกมันบนระบบปฏิบัติการที่ไม่ใช่ Mac แต่._fooไม่มีอยู่ในระบบไฟล์ของฉัน! เกิดอะไรขึ้น? ฉันจะกำจัดมันได้อย่างไร


เกลียดที่ ดูน่าเกลียดเมื่อฉันเรียกดูข้อมูลในคลังข้อมูลด้วย 7-Zip
นาธาเนียล

คำตอบ:


79

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
  • ฟังก์ชัน copyfile อธิบายไว้ใน man copyfile
  • ls -l@แสดงให้เห็นถึงปุ่มและขนาดของคุณสมบัติเพิ่มเติมls -leพิมพ์ ACL
  • xattr -l แสดงรายการคีย์และค่าของคุณสมบัติเพิ่มเติม
  • xattr -c ล้างแอตทริบิวต์เพิ่มเติมทั้งหมด (-d ไม่สามารถใช้คนเดียว)
  • chmod -N ลบ ACLs
  • ไฟล์ซิปที่สร้างขึ้นบน OS X ใช้โฟลเดอร์ __MACOSX เพื่อเก็บข้อมูลเมตาที่คล้ายกัน

ข้อมูลที่เก็บไว้เป็นคุณลักษณะเพิ่มเติม:

  • ส้อมทรัพยากร (ส้อมทรัพยากรได้รับการขยายแอตทริบิวต์ตั้งแต่ 10.4)
    • ไอคอนที่กำหนดเองที่ตั้งอยู่ใน Finder และรูปภาพของไฟล์ Icon \ r
    • ข้อมูลเมตาในไฟล์ PSD
    • วัตถุที่เก็บไว้ในไฟล์ scpt, สถานะหน้าต่าง AppleScript Editor, คำอธิบายของสคริปต์
  • ข้อมูลเกี่ยวกับนามแฝง (นามแฝงหยุดทำงานหากลบแอตทริบิวต์เพิ่มเติม)
  • สถานะการกักกันหรือ URL ต้นทางของไฟล์ที่ดาวน์โหลดจากอินเทอร์เน็ต
  • ความคิดเห็นที่น่าสนใจ
  • การเข้ารหัสไฟล์ที่บันทึกด้วย TextEdit
  • ตำแหน่ง Caret ของไฟล์ที่เปิดด้วย TextMate
  • หมายเหตุหาง

ฉันมี GNU tar 1.15.1 โดยค่าเริ่มต้นใน MacOS X 10.5.8 (Leopard) รุ่นล่าสุดจาก GNU คือ 1.22 (มีนาคม 2009) ดาวน์โหลดและสร้าง: ดูเหมือนว่าจะไม่มี '--no-xattrs' เมื่อสร้างบน MacOS X.
Jonathan Leffler

1
env COPYFILE_DISABLE tar -cf archive.tar my_folder/แทนการส่งออกตัวแปรนี้ไปทั้งระบบคุณยังสามารถใช้
Georg Schölly

1
@Cawas ปัญหาคือพวกเขาปรากฏตัวใน tarball ซึ่งฉันกระจายข้ามแพลตฟอร์มและพวกเขาไม่มีความหมายในระบบปฏิบัติการที่ไม่ใช่ของ Apple
Jesse Beder

1
ที่จริงเจสซี่พวกเขาแน่นอนมีไม่มีความหมายสำหรับ OS'es อื่น ๆ / filesystems แต่ข้อมูลอยู่ที่นั่นและเราสามารถcatหรือtypeดูว่ามีอะไรอยู่ข้างในอย่างน้อยที่สุด และมักเป็นข้อความธรรมดาที่ป้อนด้วยตนเองที่นั่น ฉันจะไม่ทิ้งมันไปเพื่อสำรอง แต่มันอาจเป็นถังขยะในกรณีที่คุณต้องการแจกจ่ายบางสิ่งบางอย่างข้ามแพลตฟอร์มและโดยเฉพาะอย่างยิ่งถ้ามันมีโดยไม่ตั้งใจ เพียงแค่พูดว่าตัวเลือกที่จะปล่อยให้พวกเขานั้นถูกต้องสวย
cregox

1
FYI, สายการส่งออกสำหรับ Leopard ยังใช้งานได้กับ Lion
jjeaton

12

ตั้งแต่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).

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

github.com/libarchive/libarchive/commit/ …และฟอรัมฟอรัม. comshowthread.php?p=20684196#post20684196ดึงความสนใจไปที่เอกสารที่ล้าสมัยจาก Apple
เกรแฮมเพอร์ริน

1

._ไฟล์ส้อมทรัพยากรดังกล่าวในคำตอบอื่น ๆ อย่างไรก็ตามมีวิธีที่ดีกว่าในการกำจัดพวกเขาเมื่อใช้tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

นอกจากนี้ยังมีdot_cleanยูทิลิตี้สำหรับทำความสะอาดไฟล์เหล่านี้ (ฉันคิดว่ามันมักจะใช้สำหรับการจัดเก็บข้อมูลภายนอก)


ขอบคุณ! ดูจุดจบของคำตอบข้างต้นสำหรับคำตอบนั้น
Jesse Beder

dot_clean ไม่สามารถใช้งานได้เนื่องจาก tar กำลังสร้างไฟล์
joedevon

0

นี่คือสคริปต์ 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('.')            

1
ดียกเว้น OS X พร้อม HFS + ...
Daniel Beck

ทำไมจะไม่ล่ะ? คุณช่วยแนะนำวิธีแก้ไขได้ไหม?
Aivar

1
ไฟล์เหล่านี้ไม่มีอยู่จริงใน HFS + เนื่องจากระบบไฟล์สามารถจัดเก็บข้อมูลเมตาภายใน ไฟล์เหล่านี้เป็นวิธีการแก้ปัญหาสำหรับระบบไฟล์ที่ไม่สนับสนุนเช่นเมื่อคุณถ่ายโอนไฟล์จาก HFS + ไปยัง FAT USB thumb drive พวกเขาจะปรากฏขึ้นและเมื่อคุณถ่ายโอนกลับไฟล์เหล่านั้นจะหายไป
Daniel Beck

-3

อักขระจุด "." ถูกใช้บนแพลตฟอร์ม Mac เป็นตัวบ่งชี้ไฟล์ที่ซ่อนอยู่ สำหรับ Windows เป็นตัวอักษร "$" อย่างไรก็ตามไฟล์. _foo นั้นอาจมีข้อมูลเฉพาะของ OS X อยู่และฉันขอแนะนำให้ไม่ลบมัน ในระบบอื่นคุณจะต้องไม่สนใจมันหรือบางคนที่นี่อาจสามารถจัดเตรียมสคริปต์ที่จะซ่อนไฟล์และโฟลเดอร์ที่ขึ้นต้นด้วย "."


มันเป็นข้อมูลเมตาทั้งหมดส่วนใหญ่เป็นไอคอนที่กำหนดเองแอปพลิเคชันที่สร้างไฟล์ ฯลฯ มันปลอดภัยที่จะลบ
dreamlax

ยังถ้าคุณใช้ Mac เป็นหลักฉันขอแนะนำให้เก็บไว้ หากคุณใช้ Windows มากกว่า OS X ให้ดำเนินการต่อและฆ่ามัน
dbmikus

(@dreamlax) มันเป็นความจริงที่ว่าข้อมูลส่วนใหญ่ที่จัดเก็บในแอ็ตทริบิวต์ส่วนขยายเป็นข้อมูลเมตาที่อาจจะปลอดภัยในการลบ แต่นั่นไม่ใช่กรณีเสมอไป โดยเฉพาะอย่างยิ่งเมื่อไฟล์ที่มี“ resource forks” ถูกเก็บไว้ในสิ่งที่ไม่ได้รับ HFS ​​(FAT, UFS, tar, ฯลฯ ) ไฟล์ '._ *' เหล่านี้จะถูกใช้เพื่อเก็บข้อมูลจาก ส้อมทรัพยากร ในขณะที่รูปแบบไฟล์หลายรูปแบบกำลังเคลื่อนห่างจากการใช้ส้อมทรัพยากร (ไปยังบันเดิล) มีไฟล์บางไฟล์ที่จัดเก็บข้อมูลที่สำคัญในส้อมทรัพยากร (บางครั้งข้อมูลทรัพยากรเป็นข้อมูลเท่านั้น)
394 Chris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.