จะรับไฟล์เก็บถาวร tar ว่างได้อย่างไร


24

ฉันกำลังสร้าง RPM ซึ่งทุกอย่างมีอยู่ในไฟล์ .spec (ไม่ต้องถาม :-) rpmbuild ต้องการไฟล์ "ซอร์ส" ดังนั้นฉันพยายามสร้างไฟล์ tar ที่ว่างเปล่า อย่างไรก็ตามถ้าฉันไม่ให้ชื่อไฟล์ใด ๆ tar ก็บ่น:

tar: Cowardly refusing to create an empty archive
Try `tar --help' or `tar --usage' for more information.

ฉันจะสร้างไฟล์ tar ที่ว่างเปล่าอย่างแท้จริงได้อย่างไร


ได้รับคำตอบก่อนหน้านี้ที่นี่: superuser.com/questions/133186/…
Rhyuk

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

คำตอบ:


24

คุณสามารถบังคับ GNU และ BSD tar เพื่อสร้างไฟล์เก็บถาวรว่างด้วย:

tar -cf tarfilename.tar -T /dev/null

ใช่ตัวเลือก 'f' จะต้องมีอายุตามที่ระบุชื่อไฟล์ คุณกำลังจะสร้างไฟล์เก็บถาวรชื่อ T แต่จะเกิดข้อผิดพลาดในไฟล์ tarfilename.tar ที่หายไป
lornix

1
เหตุผลหนึ่งในการสร้าง tar ที่ว่างเปล่า: การสร้าง tar แบบ scripted ขั้นตอนที่ 1: สร้างน้ำมันดิน ขั้นตอนที่ 2: เพิ่มไฟล์ทีละไฟล์ คุณสามารถทำได้ด้วยการ "ถ้าไฟล์แรกแล้วสร้างอื่นแล้วผนวก" แต่นั่นไม่ราบรื่น
dpk

4
@dpk: ถ้าฉันเข้าใจสิ่งที่คุณพูดทำไมคุณไม่ใช้ผนวกเสมอ ผนวกจะสร้างไฟล์ tar หากยังไม่มีอยู่ดังนั้นคุณไม่จำเป็นต้องตรวจสอบว่าเป็นไฟล์แรกแค่ต่อท้ายและถ้าเป็นไฟล์แรกที่ tar จะสร้างขึ้น
ฌอน Reifschneider

1
@SeanReifschneider ดูเหมือนว่าจะทำงานได้ดี ดี
dpk

1
@SeanReifschneider: +1 สำหรับคำใบ้ว่าโหมดต่อท้ายจะสร้างไฟล์เก็บถาวรสำหรับไฟล์แรกหากยังไม่ได้อยู่ในดิสก์ ฉันใช้คำสั่ง find เพื่อเรียกใช้ tar ในโหมดต่อท้ายในสคริปต์ดังนั้นไม่จำเป็นต้องสร้างไฟล์เก็บถาวรก่อนมือ
GuruM

8

BSD: tar cvf empty.tar --from-file /dev/null

GNU (Linux): tar cvf empty.tar --files-from /dev/null

Solaris: tar cvf empty.tar -I /dev/null


ในที่สุดบางสิ่งบางอย่างที่ทำงานใน Solaris !! ขอบคุณมาก
AJPerez

4

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

$ head --bytes=10240 /dev/zero > empty.tar
$ truncate --size=10240 empty.tar
$ fallocate --length=10240 empty.tar
$ dd if=/dev/zero bs=10240 count=1 iflag=fullblock > empty.tar
$ dd if=/dev/zero bs=1 count=10240 > empty.tar

@ KamilMaciorowski ขอบคุณสำหรับคำแนะนำของคุณเกี่ยวกับการใช้งาน DD! ฉันเรียนรู้สิ่งใหม่! เกี่ยวกับการตอบคำถามที่ถูกต้อง: ชื่อจริงถาม "วิธีบังคับ tar" แต่เมื่ออ่านข้อความคำถามมันชัดเจนว่า OP ต้องการไฟล์ tar ที่ว่างเปล่าจริง ๆ และไม่ควรสำคัญว่าอย่างไร
josch

ฉันไปข้างหน้าและแก้ไขคำถาม
Kamil Maciorowski

3

ฉันสามารถสร้างไฟล์เก็บถาวรที่ว่างได้โดยการเก็บไฟล์เดียวแล้วลบไฟล์ออกจากไฟล์เก็บถาวร

tar cf empty.tar somefile                   # creates archive
tar --delete -f empty.tar somefile          # remove the file
tar tf empty.tar                            # list contents of archive

มันใช้งานได้สำหรับฉัน


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