ความเข้ากันไม่ได้ของ Linux / OS X tar - tarballs ที่สร้างขึ้นบน OS X จะให้ข้อผิดพลาดเมื่อไม่ได้ทำการทดสอบใน Linux


106

เมื่อฉันวางไฟล์บน Macbook ของฉันและยกเลิกการติดตั้งใน Linux ฉันจะได้รับคำเตือน / ข้อผิดพลาดต่อไปนี้ซ้ำ ๆ :


 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Error exit delayed from previous errors

โชคดีที่สิ่งนี้ไม่ส่งผลกระทบต่อไฟล์ที่จัดเก็บในไฟล์เก็บถาวรซึ่งได้รับการกู้คืนอย่างสมบูรณ์ อย่างไรก็ตามมันทำให้เกิดปัญหาในหลาย ๆ สถานการณ์โดยเฉพาะอย่างยิ่งเมื่อต้องรับมือกับกระบวนการสร้างที่โค้ดความล้มเหลวที่ไม่เป็นศูนย์ส่งคืนโดย 'tar' ทำให้เกิดการสร้างและติดตั้งเพื่อหยุดโดยไม่จำเป็น

ฉันจะทำให้ OS X สร้างไฟล์ tar ที่เล่นได้ดีกับส่วนที่เหลือของโลก Linux อย่างไร

นอกจากนี้สำหรับคะแนนโบนัสมีไฟล์ tar ที่เปิดเผยสู่สาธารณะพร้อมปัญหาเหล่านี้ มีวิธีใดที่จะให้ Linux จัดการไฟล์ tar ได้อย่างงดงามโดยไม่ต้องเปลี่ยนวิธีการบีบอัดไฟล์เดิม?

คำตอบ:


71

ฉัน Googled สำหรับข้อผิดพลาดและมันดูเหมือนว่า tar BSD กับ GNU tarปัญหา

ติดตั้ง GNU tarถ้าคุณสามารถบน Mac OS tarและใช้ในการสร้าง


17
Mac OS X 10.6 ใช้ tar BSD โดยค่าเริ่มต้น แต่ยังมีเรือ gnutar /usr/bin/gnutarที่

@Ned ขอบคุณ. นั่นเป็นข้อมูลที่ดี
Dave Dopson

15
FYI: / usr / bin / gnutar ไม่ได้จัดส่งอีกต่อไปกับ Mac OS X (อย่างน้อยเป็นของ Mavericks)
foobar

พอร์ต sudo ติดตั้ง gnutar cd / usr / bin sudo RM tar sudo คำสั่ง ln -s / opt / local / bin / gnutar tar
chaosless

หากใช้ MacPorts คุณสามารถใส่ / opt / local / libexec / gnubin / ที่ด้านบนของ PATH แทนที่จะลบอะไรจาก / usr / bin หรือสร้าง symlink ด้วยตนเอง
Lorrin

62

หากคุณใช้ Mavericks หรือใหม่กว่าค่า gnutar จะไม่ถูกรวมอีกต่อไปโดยค่าเริ่มต้น

การหลีกเลี่ยงหากคุณใช้โฮมบรูว์คือการดำเนินการต่อไปนี้:

brew install gnu-tar

จากนั้นคุณสามารถใช้คำสั่งgtarเพื่อความเข้ากันได้ของ linux


หากคุณต้องการแทนที่tarด้วยgtarเพียงแค่แทนที่ symlink

tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version

หากต้องการคืนค่า tar เดิมที่มาพร้อมกับ Mac Os X ให้เรียกใช้คำสั่งด้านบน แต่แทนที่which gtarด้วยwhich bsdtar

ที่มา:
https://github.com/jordansissel/fpm/issues/576


4
ไม่จำเป็นต้องยกเลิกการเชื่อมโยงอีกต่อไปตามที่ผู้ผลิตสั่งคุณสามารถเพิ่มสิ่งนี้ลงใน PATH ของคุณใน.bashrc(หรือสิ่งที่เทียบเท่า):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty

1
หรือเพียงแค่สร้างtarลิงค์/usr/local/binด้วยcd /usr/local/bin ; ln -s gtar tar- อาจเป็นตัวเลือกที่ง่ายที่สุด
Karthik T

27

tar GNU ไม่ชอบข้อมูลเสริมบางตัวที่ tar OSX BSD เริ่มต้นรวมอยู่

GNU tar จะให้คุณระงับคำเตือนเหล่านั้นด้วยตัวเลือก:

--warning=no-unknown-keyword

ดู: https://www.gnu.org/software/tar/manual/html_section/tar_27.html

โปรดทราบว่า tar BSD ไม่สนับสนุนการตั้งค่าสถานะนั้นดังนั้นหากคุณต้องการเรียกใช้รหัสการคลายแพ็กเกจเดียวกันบนทุกแพลตฟอร์มคุณสามารถใช้สิ่งต่อไปนี้:

isGnuTar=$(tar --version | grep -q 'gnu')
if [ $? -eq 0 ]
then
    echo "Detected GNU tar"
    tar --warning=no-unknown-keyword -zxf my.tar.gz
else
    tar -zxf my.tar.gz
fi

5
นี่ควรเป็นคำตอบที่ถูกต้องเพราะไม่ได้เกี่ยวข้องกับการติดตั้งเครื่องมือใหม่ทั้งหมดเพื่อไม่ให้มีคำเตือนเดียว
cz

10

เพื่อแยกไฟล์ tar อย่างถูกต้องโดยไม่มีข้อผิดพลาดใด ๆ บนระบบ Linux คุณสามารถใช้ bsdtar

sudo apt-get install bsdtar

จากนั้นใช้ตามปกติ

bsdtar -xvf file.tarfile.tarไฟล์ tar ที่คุณต้องการแตกไฟล์อยู่ที่ไหน

ที่มา: https://bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

อีกวิธีหนึ่งคุณสามารถใช้ลูกกลิ้งแฟ้ม GNOME


6
COPYFILE_DISABLE=1 tar cf filename.tar

หรือ

tar --disable-copyfile cf filename.tar

นี่เป็นคุณลักษณะที่น้อยที่สุดที่ค้นพบได้ของ tar บน OS X ที่ฉันรู้จักเป็นการส่วนตัว

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


แก้ไข: ดูเหมือนว่าสิ่งนี้อาจหยุดการสร้าง._fooไฟล์ -type ที่ไม่ต้องการเท่านั้น แต่จะไม่หยุดการสร้างส่วนหัว (อย่างน้อยใน Yosemite / 10.10) ขอบคุณผู้แสดงความคิดเห็นสำหรับการชี้ให้เห็น อย่างไรก็ตาม (สำหรับคะแนนโบนัส :) คุณสามารถจัดการ tarballs ได้อย่างงดงามโดยแยกมันออกมาเป็นแบบนี้:

tar xf filename.tar --pax-option=delete=SCHILY.*,delete=LIBARCHIVE.*

สิ่งนี้ใช้ได้กับ gnu tar 1.15.1 ซึ่งค่อนข้างเก่า! อีกวิธีหนึ่งคุณสามารถใช้ pax แทนซึ่งสำหรับฉัน () สำหรับข้อมูลเพิ่มเติมลงในPaxHeaderไดเรกทอรี แต่อย่างน้อยออกโดยไม่มีข้อผิดพลาด:

pax -rf filename.tar

น่าเศร้าที่นี่ไม่ปรากฏว่าจะหยุดคำเตือนส่วนหัวที่ขยายเมื่อไม่ได้ใช้งานกับ gnutar
JJC

ดูเหมือนว่าทั้งสองอย่างนี้จะไม่สามารถใช้งานกับ Yosemite ได้ ( tar --versionบ่งชี้bsdtar 2.8.3 - libarchive 2.8.3) นอกจากนี้ฉันต้องการประก่อนcfในกรณีหลัง
tripleee

4

MacOSX มาพร้อมกับ gnutar แล้ว หากคุณต้องการวิธีการแก้ปัญหาที่รวดเร็วและสกปรกให้เพิ่มไปยัง~/.bash_profile

alias tar='gnutar'

และเรียกใช้source ~/.bash_profileเพื่ออัปเดต

นอกจากนี้ OSX ยังมาพร้อมกับทั้ง GNU และ BSD tar ดังนั้นคุณสามารถยกเลิกการลิงก์ ref ของ tar จาก bsd ไปยัง gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar

1
ทำไม/etc/hosts? /etc/hostsสำหรับการจับคู่โฮสต์ / IP ใช่ไหม
BenjiWiebe

1
สิ่งที่ @BenjiWiebe พูด บิตอื่น ๆ คือการแก้ไข / etc / hosts ฉันคิดว่าคุณหมายถึง ~ / .bashrc
Dave Dopson

2
ใน OS X .bashrcจะไม่ถูกโหลดสำหรับเซสชันเทอร์มินัล คุณต้องการ.bash_profileเนื่องจากเชลล์ล็อกอินเริ่มต้นด้วยหน้าต่าง Terminal ใหม่ / cc @BenjiWiebe
slhck

ถูกต้อง :-) ฉันยังทำงานใน / etc / hosts ในเวลานั้นดังนั้นมันจึงพ่นลงบนแป้นพิมพ์ จับได้ดี
Du3

2

ขอขอบคุณ. หัวข้อนี้มีประโยชน์มาก หากคุณใช้ MacPort นี่เป็นวิธีการอย่างรวดเร็ว:

sudo port install gnutar

sudo ln -s /usr/local/opt/gnu-tar/libexec/gnubin/tar /usr/bin/gnutar

sudo ln -s /opt/local/libexec/gnubin/tar /usr/bin/gnutar

เพิ่มบรรทัดต่อไปนี้ลงใน/Users/هyameame Same/.profile

alias tar='/opt/local/libexec/gnubin/tar'

ออกจากการยกเลิกและรีสตาร์ทหน้าต่างเทอร์มินัลของคุณ


1

ใช่ไบนารี tar ในตัวของ Mac เพิ่มสิ่งพิเศษมากมายที่ CentOS ไม่ชอบ ในการแก้ไขปัญหาให้ทำดังต่อไปนี้:

sudo mv /usr/bin/tar /usr/bin/darwintar
sudo ln -s /usr/bin/gnutar /usr/bin/tar
ls -l /usr/bin/tar

หวังว่าจะช่วย!


นั่นเป็นวิธีหนึ่ง ฉันจะแก้ไขปัญหา GNU / BSD มากขึ้นครอบคลุมในgithub.com/ddopson/dotfiles ฉันมี ~ / bin / coreutils ในช่วงต้นของเส้นทางและมี shims เล็ก ๆ ในนั้นเช่นgithub.com/ddopson/dotfiles/blob/master/bin/coreutils/tarที่เลือกปฏิบัติการที่ถูกต้องตาม linux vs Mac และถ้าสภาพแวดล้อม COREUTILS ตัวแปรถูกตั้งค่า
Dave Dopson

คุณอาจต้องการแก้ไขคำแนะนำของคุณเพื่อบอกให้คนอื่นตรวจสอบว่ามี / usr / bin / gnutar อยู่ก่อนที่จะย้าย tar ที่ทำงานอยู่ มือใหม่สามารถค้นหาสิ่งนี้ได้โดยใช้ google และไม่ทราบวิธีการยกเลิกระบบของพวกเขา
msouth

นั่นอาจไม่ใช่ความคิดที่ดีด้วยเหตุผลสองประการ 1) ตอนนี้แพ็คเกจของ Apple ไม่ทราบว่าจะหา tar แบบดั้งเดิมได้จากที่ใด tar ที่รู้วิธีจัดการแอตทริบิวต์ของไฟล์ Apple 2) ถ้าคุณต้องใช้ GNU tar สถานที่ที่เหมาะสมที่จะนำมันอยู่ข้างหน้าในเส้นทางการค้นหาของคุณเช่น / usr / local / bin หรืออะไรบางอย่างและ 3) มันอาจปลอดภัยกว่าที่จะเรียกtargnutar ของโปรแกรมต่างประเทศเพื่อหลีกเลี่ยงซอฟต์แวร์ที่สับสน คาดหวังให้ Mac ทำตัวเหมือน Mac $ 0.02 -Erik
Erik Bennett

0

โอเคฉันใช้การค้นหาโดย Google แต่ลิงค์สามอันดับแรกยืนยันสิ่งที่ฉันสงสัย

  1. บั๊กใน tar ของคุณและ / หรือ
  2. ความเข้ากันไม่ได้ระหว่างยูทิลิตี้ tar สองตัว
    ดูลิงค์นี้ มีคนรายงานว่า "การใช้" bsdtar -xvf "ใช้งานได้"

แก้ไข:คุณอยู่ในระบบ Mac ฉันคิดว่าวิธีอื่น ๆ คุณจะต้องใช้ gnutar ควรติดตั้งไว้แล้วหากไม่ได้รับการติดตั้ง แน่นอนคุณสามารถดูลิงค์อื่น ๆ โดยค้นหาด้วยตัวเอง


0

บน MAC OSX ติดตั้ง gnu-tar

brew install gnu-tar

จากนั้นสร้าง tar ที่เข้ากันได้กับ linux ของคุณด้วย:

gtar -c -f your_tar_file files

หรือคุณสามารถสร้างไฟล์เก็บถาวรด้วยรูปแบบ pax

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