tar: การนำชื่อ `/ 'นำออกจากชื่อสมาชิก


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

ฉันจะแก้ปัญหานี้และรักษา/ชื่อไฟล์ไว้ได้อย่างไร?


2
อะไรไม่ทำงานตามที่คาดไว้

34
มันไม่ใช่ปัญหา. คุณไม่ต้องการให้นำเครื่องหมายทับทับในไฟล์เก็บถาวร tar อย่างจริงจัง. หากคุณต้องการแตกไฟล์เก็บถาวรไปยังรูทระบบของคุณให้ระบุ-C /เมื่อแตกไฟล์
ThiefMaster

คำตอบ:


69

ใช้ตัวเลือก--absolute-namesหรือ-Pเพื่อปิดใช้งานคุณสมบัตินี้

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
นี่คือคำตอบที่ถูกต้อง แต่โปรดระวังว่าในกรณีส่วนใหญ่นี่ไม่ใช่สิ่งที่คุณต้องการเพราะมันจะส่งผลให้เกิดการเก็บถาวรที่แยกในเส้นทางที่สมบูรณ์!
rubo77

8
การใช้-C /ตัวเลือกตามที่อธิบายไว้ในคำตอบ @Marcus จะลบข้อความ STDERR หากเป็นเป้าหมายหลักของคุณ
Matt Sanders

1
ดังที่ @ rubo77 แสดงความคิดเห็นโดยปกตินี่ไม่ใช่ผลลัพธ์ที่คาดหวังของคำสั่ง
alfredocambera

3
ส่วนใหญ่เวลานี้ไม่ใช่สิ่งที่ผู้ใช้ต้องการเพียงเพราะพวกเขาส่วนใหญ่ไม่อ่านคู่มือจนกว่าพวกเขาจะต้อง (ไม่มีใครมีเวลาสำหรับที่) อย่างน้อยก็ควรขยายคำตอบของคุณเตือนผู้คนอย่าให้ทำเช่นนี้จนกว่าพวกเขาจะแน่ใจอย่างแน่นอนว่าพวกเขาเข้าใจว่าอะไรคือผลของมัน โดยเฉพาะอย่างยิ่งการยอมรับว่าเป็นคำตอบ
Mladen B.

1
เพิ่ม @Toskan ตัวอย่างแล้ว
Barmar

89

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

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


5
บางครั้งคุณสมบัติเป็นปัญหา tarผมพบว่าหัวข้อนี้หลังจากตั้งค่าสคริปต์การสำรองข้อมูลที่จะส่งอีเมลในสถานะที่ไม่ใช่ศูนย์การออกจาก ข้อความเฉพาะนี้ทำให้เกิดtarการออกด้วยสถานะ1ซึ่งทำให้ฉันได้รับการแจ้งเตือนอีเมลเท็จเกี่ยวกับการสำรองข้อมูลที่ประสบความสำเร็จเพียงเพราะtarเขียนข้อความนี้ไปยัง STDERR ฉันแก้ไขปัญหานี้โดยใช้โซลูชัน @ Marcus เวอร์ชัน tweaked ของตัวเอง:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails

1
ฉันคิดว่ามีกรณีการใช้งานบางอย่างสำหรับการใช้งาน-P- ตัวอย่างเช่นหากคุณให้ฟีเจอร์การถ่ายภาพระบบไฟล์ใน FUSE บางครั้งคุณอาจต้องการยกเลิกการจับภาพสแนปชอตในไดเรกทอรีที่เฉพาะเจาะจงมากกว่าcwdจากมุมมองของผู้ใช้
DIMMSum

81

หากคุณต้องการที่จะกำจัดของ "การถอดชั้นนำ` /' จากชื่อสมาชิก" ถูกพิมพ์ไป STDERR แต่ยังคงต้องการที่จะออกจากปิดทับชั้นนำเหล่านั้นเป็นอย่างชาญฉลาดไม่ tar โดยเริ่มต้นที่ผมเห็นเป็นทางออกที่ดีที่นี่โดยการแสดงความคิดเห็น timsoft

โซลูชันเกี่ยวข้องกับการใช้อ็อพชัน -C เพื่อเปลี่ยนไดเร็กทอรีเป็นรูท (/) จากนั้นระบุทรีไฟล์เพื่อเก็บถาวรโดยไม่ต้องใช้เครื่องหมายทับหน้าเพราะตอนนี้คุณต้องการพา ธ สัมพัทธ์เท่านั้น สิ่งนี้ทำในสิ่งเดียวกันกับคำสั่ง tar ปกติ แต่ไม่จำเป็นต้องมีการลอก

tar fcz bkup.tar.gz -C / home/foo/

มันจะไม่ทำงานกับการสำรองข้อมูลที่เพิ่มขึ้น แต่คำตอบที่ดี
gajdipajti

มันยังไม่ทำงานหากคุณต้องการ tar ไฟล์ที่แสดงโดยการขยายตัวของเชลล์ (เช่นtar c -C / home/foo/*) เนื่องจากเชลล์ไม่ทราบเกี่ยวกับรูทที่เปลี่ยนแปลง แต่ก็ยังเป็นคำตอบที่ดีสำหรับกรณีอื่น ๆ
Boris

1
-C /ไม่ได้ผลสำหรับฉันระยะเวลา มันไม่ได้ป้องกัน stderr สำหรับฉัน
คิวเมนตัส

3
@ABB ตรวจสอบให้แน่ใจเส้นทางต่อไปนี้ -C / เป็นญาติ
zurfyx

วิธีการนี้จะใช้ได้หรือไม่หากผู้ใช้ไม่มีสิทธิ์ในไดเรกทอรีรูต
Mladen B.

31

ปลายเดือนหนึ่ง แต่ฉันพบวิธีแก้ปัญหาที่เหมาะสมที่สุดสำหรับเคสของฉัน (ในเชลล์สคริปต์) คือไปที่ไดเร็กทอรีพาเรนต์และเรียกใช้งานคำสั่งที่นั่น

cd /var/www/
tar -czf mysite.gz mysite

แทน:

tar -czf /var/www/mysite.gz /var/www/mysite

9
แน่นอนคุณสามารถทำได้โดยใช้: tar -zcvf mysite.gz -C / var / www / mysite / ประโยชน์ของสิ่งนี้คือคุณสามารถดำเนินการได้จากไดเรกทอรีใด ๆ
alfredocambera

ขอขอบคุณสำหรับความช่วยเหลือของคุณ. นี่คือสิ่งที่ฉันต้องการ ฉันไม่ต้องการเส้นทางเต็มรูปแบบใน tarball ของฉันเพียงแค่โฟลเดอร์ปลายทาง
Christia

ฉันคิดว่านี่น่าจะเป็นคำตอบที่ถูกต้องฉันคิดว่า
Mladen B.

ฉันไม่เห็นว่าสิ่งนี้ตอบคำถามได้อย่างไร มันเป็นสิ่งที่แตกต่างที่สามารถทำได้ ……… Like: Q: ฉันจะได้รับจากลอสแอนเจลิสไปนิวยอร์กได้อย่างไร? ตอบ: ไปที่ซานฟรานซิสโกแทน
G-Man

ฉันเห็นด้วยกับ @ G-Man ซึ่งจะส่งผลให้ไฟล์ tar ที่มีโครงสร้างไดเรกทอรีแตกต่างไปจากเดิมอย่างสิ้นเชิง ในบางกรณีโครงสร้างไดเรกทอรีนั้นเหมาะสมกว่าในตอนแรก แต่ไม่ตอบคำถาม
Kevin Keane

7

2>&1 | grep -v "Removing leading"นี่คือวิธีที่ฉันไม่ได้โดยใช้วิธีการบังคับเดรัจฉาน:

ตัวอย่างเช่น:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

4
ปัญหานี้คือมันซ่อนรหัสข้อผิดพลาด ดังนั้นหากคุณต้องการตรวจสอบรหัสข้อผิดพลาดจาก tar ในสคริปต์ทุบตีมันจะไม่ส่งคืน 0 เมื่อสำเร็จ
Brian

@staticx รหัสข้อผิดพลาดคือ 0 โดยไม่คำนึงถึง
คิวเมนตัส

1
@ABB tarคำสั่งของฉันอาจกลับมา2เนื่องจากข้อผิดพลาดร้ายแรง
Jite

1
@Brian คุณสามารถใช้ $ PIPESTATUS เพื่อรับรหัสออก ดูunix.stackexchange.com/questions/14270/…
simpleuser

3

ลองใช้-Cสำหรับพา ธ เท่านั้นซึ่งจะป้องกันการบีบอัดด้วยพา ธ ที่สมบูรณ์:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

ฉันแก้ไขปัญหานี้ด้วย:

cd /home/foo && tar czf ~/backup.tar.gz .

ในแบบที่คุณไม่ได้พยายามใส่เส้นทางที่แน่นอนในการเก็บถาวร tar ในสถานที่แรก หากคุณต้องการ untar ที่รากของระบบไฟล์คุณเพียงแค่

cd / && tar xzf backupt.tar.gz หลังจากถ่ายโอน

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