คำสั่ง tar - ข้าม symlink


13

ฉันใช้คำสั่ง tar เป็น

tar -cvf protTests.tar protTests/*

ไปยังtarไฟล์ทั้งหมดภายในโฟลเดอร์, protTests. แต่นี่รวมถึงลิงก์สัญลักษณ์ภายในโฟลเดอร์ซึ่งไม่ได้เป็นที่ต้องการ

มีตัวเลือกบรรทัดคำสั่งที่จะออก symlink ทั้งหมดหรือไม่

คำตอบ:


11

คุณสามารถทำเช่นนี้เพื่อจัดหาtarรายการไฟล์ทั้งหมดที่อยู่ภายในprotTestsยกเว้นไฟล์ที่มี symlink:

find protTests -maxdepth 1 -mindepth 1 -not -type l -print0 |
  tar --null --files-from - -cvf protTests.tar

อย่างไรก็ตามคำสั่งที่มีอยู่ของคุณ:

tar -cvf protTests.tar protTests/*

จะไม่เก็บถาวรไฟล์ทั้งหมดในprotTestsมันจะเก็บเฉพาะไฟล์ที่มีชื่อที่ไม่ได้ขึ้นต้นด้วย.(ไฟล์ที่ไม่ได้ซ่อน) *ไฟล์ประกอบ glob ข้ามที่มีชื่อขึ้นต้นด้วย.โดยการออกแบบ คำสั่งยังมีปัญหาที่หากprotTestsมีไฟล์จำนวนมาก (มากกว่าหลายพันไฟล์) จากนั้นprotTests/*สามารถขยายไปยังอาร์กิวเมนต์มากเกินไปเพื่อให้พอดีกับบรรทัดคำสั่ง

คำสั่งที่ง่ายกว่านี้จะไม่มีปัญหาเหล่านั้น:

tar -cvf protTests.tar protTests

1
Tar ไม่มีตัวเลือก--files-fromนี่คือตัวเลือกจาก gtar ดังนั้นคุณจึงให้คำแนะนำดังกล่าวดีกว่าพูดถึงว่านี่เป็น gtar ที่เฉพาะเจาะจง ค้นหาไม่มีหลัก-notนี่คือ GNUism อื่นที่ไม่ใช่แบบพกพา โดยทั่วไปเป็นความคิดที่ดีที่จะใช้การค้นหาแบบแยกสาย สิ่งนี้อาจทำให้เกิดปัญหากับตัวละครตลกในชื่อไฟล์และมันให้ประสิทธิภาพที่ต่ำอย่างแน่นอนเนื่องจากทั้ง find และ tar จำเป็นต้องสแกนระบบไฟล์ ปัญหาเหล่านี้ใช้ไม่ได้กับโปรแกรมเช่น star ที่ใช้ libfind ดังนั้นจึงมีรหัสการค้นหารวมอยู่ด้วย
schily

ให้ฉันเพิ่มคำใบ้ทั่วไปอีกข้อหนึ่ง: เมื่อให้คำแนะนำที่เฉพาะเจาะจงกับผู้จำหน่ายเฉพาะของโปรแกรม UNIX มันเป็นแนวปฏิบัติที่ดีที่จะกล่าวถึงผู้ขายและเป็นผู้ขายเฉพาะ โดยทั่วไปสามารถทำได้โดยใช้ชื่อทางการของซอฟต์แวร์เช่น gtar แทน tar, vim แทนที่จะเป็น vi โปรดทราบว่านี่เป็นแพลตฟอร์มข้อมูลที่เกี่ยวข้องกับ UNIX ดังนั้นในตัวอย่างทั่วไปควรจัดให้สอดคล้องกับมาตรฐาน POSIX
Schily

คุณพูดถูก @schily นี่เป็นโซลูชันเฉพาะของ GNU คำตอบของคุณขึ้นอยู่กับstarทางเลือกที่ดีและฉันได้ upvoted มันด้วยเหตุผลนั้น ฉันยังเห็นด้วยกับการคัดค้าน "ตัวละครตลก" แต่เนื่องจาก GNU tarไม่มี-0ตัวเลือกมันเป็นการแลกเปลี่ยน ฉันไม่เห็นด้วยกับการคัดค้านการปฏิบัติงานนั่นไม่ได้เกิดขึ้นจริงในสถานการณ์นี้
Celada

2
@ schily ทั้ง GNU tarและbsdtarมี--files-fromและ--nullสิ่งที่ลบปัญหาเกี่ยวกับตัวละครตลก (ถ้ารวมกับfind's -print0หรือ-exec printf '%s\0' {} +) แต่ที่นี่คุณอาจต้องการเพิ่ม--no-recursionตัวเลือก paxการใช้งานบางอย่างยังมี-0ตัวเลือก
Stéphane Chazelas

2
@schily tarผมรู้สึกว่าด้ายความคิดเห็นนี้ไม่ได้เป็นสถานที่สำหรับการสนับสนุนสำหรับรุ่นที่แตกต่างกันของ กรุณานำไปแชท มันนานเกินไปแล้วและการอ่านเช่นสงครามศาสนา ณ จุดนี้ฉันไม่คิดว่ามันสำคัญกับรุ่นtarใดที่ใช้อยู่ เราไม่รู้ด้วยซ้ำว่า Unix ใช้งานอะไร
Celada

-2

การใช้ tar ของฉันเป็นวิธีที่ดีที่สุด

star -cv -f out.tar -find protTests ! -type l

8
zsh: command not found: starเมื่อคุณพูดถึงอรรถประโยชน์ที่คุณรู้> 99% ของผู้อ่านของคุณจะไม่มีอยู่ในระบบของคุณให้อธิบายว่าจะรับได้จากที่ไหน และคุณต้องเปิดเผยความร่วมมือของคุณเมื่อคุณพูดถึงผลิตภัณฑ์ของคุณเอง (ไม่ว่าคุณจะโพสต์ลิงค์หรือไม่ดังนั้นคุณอาจโพสต์ลิงค์)
Gilles 'SO- หยุดความชั่วร้าย'

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

8
คนส่วนใหญ่ที่ใช้น้ำมันดินบ่อย ๆ ไม่เคยได้ยินถึงสันติภาพเลย
Gilles 'หยุดความชั่วร้าย'

ผู้คนที่ไม่รู้ว่าพวกเขากำลังใช้ gtar บน Linux เมื่อพวกเขาเรียกว่า "tar" อาจไม่ใช่คนที่สนใจอยู่ดี ดาวเป็นการใช้งาน tar ฟรีที่เก่าแก่ที่สุดและคุณลักษณะหลายอย่างที่เห็นในการติดตั้ง tar ต่าง ๆ ได้ถูกนำมาจากดาวดังนั้นทำไมไม่พูดถึงต้นฉบับ
schily
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.