วิธี tar น้ำมันดินแล้วลบต้นฉบับรวมถึงไดเรกทอรี?


30

ฉันกำลังพยายามtarรวบรวมไฟล์ในไดเรกทอรีที่เรียกว่า 'my_directory' และลบต้นฉบับโดยใช้คำสั่ง:

tar -cvf files.tar my_directory --remove-files

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

แก้ไข:

ใช่ฉันคิดว่าตัวเลือก 'ลบไฟล์' นั้นแท้จริงแล้ว แม้ว่าฉันก็พบว่าหน้าคนไม่ชัดเจนในจุดนั้น (ใน linux ฉันมักไม่ค่อยแยกความแตกต่างระหว่างไดเร็กตอรี่และไฟล์มากนักและลืมบางครั้งว่ามันไม่เหมือนกัน) ดูเหมือนว่าฉันทามติจะไม่ลบไดเรกทอรี

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

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


นิโคลัสประเด็นของคุณที่จะเพิ่มอันตรายที่ต้องลบทรีไดเรกทอรีในขั้นตอนพิเศษนั้นใช้ได้ ฉันคิดว่ามันควรจะเป็นไปได้ที่จะทำสิ่งนี้อย่างปลอดภัยโดยผู้จัดเก็บ ฉันยังเชื่อว่านี่เป็นความตั้งใจของผู้สร้างของ GNU tar ที่อย่างน้อยก็ควรจะได้รับ ;-)
mit

2
ฉันพบว่าตัวเลือก - ลบไฟล์จริง ๆ แล้วลบ dir ที่มีอยู่ - อย่างน้อยในบางแพลตฟอร์ม / ในบางรุ่น - และในกรณีของฉัน อาจเป็นได้ว่าในกรณีของคุณผู้ใช้ที่เหลือไม่ว่างเปล่าเนื่องจากไฟล์บางไฟล์ถูกแก้ไขหลังจากที่ไม่ได้ใช้งาน
isync

@ ดูเหมือนว่าฉันกำลังประสบ - ลบไฟล์ลบไดเรกทอรีบน Ubuntu 14.04 ยกเว้นในกรณีของฉันฉันไม่ต้องการมัน Haha
Bradley Odell

คำตอบ:


12

คุณไม่มีส่วนที่ระบุว่า--remove-filesตัวเลือกลบไฟล์หลังจากเพิ่มไปยังไฟล์เก็บถาวร

คุณสามารถติดตามการดำเนินการเก็บถาวรและการลบไฟล์ด้วยคำสั่งเช่น

ค้นหา / เส้นทาง / ไป / ถูก / เก็บถาวร / -depth -type d -empty -exec rmdir {} \;


ปรับปรุง: คุณอาจจะสนใจในการอ่านนี้การสนทนาสั้น ๆ เกี่ยวกับ Debian,
Bug 424692: --remove ไฟล์บ่นว่าไดเรกทอรี "มีการเปลี่ยนแปลงในขณะที่เราอ่านมัน"


อาจจะเป็นจริง: -cไดเรกทอรีการเปลี่ยนแปลงก่อนที่จะtarเริ่มงาน (และชนิดของไม่กลับจนกว่าจะทำ)? ฉันเดาว่ามันจะมีการลบไดเรกทอรีย่อยหากสิ่งเหล่านั้นรวมอยู่ในที่เก็บถาวร (แต่ฉันยังไม่ได้ทดสอบ)
Arjan

@Arajan ฉันไม่คิดว่า ' c'มีส่วนเกี่ยวข้องกับสิ่งนี้ 'remove-files'จงใจไม่ลบไดเรกทอรี
nik

ใช่ฉันพบคำอธิบายสั้น ๆ ว่า "ลบไฟล์หลังจากเพิ่มลงในไฟล์เก็บถาวร" จากmanหน้าเว็บที่ไม่ชัดเจนเกินไป แต่ฉันคิดว่าคุณพูดถูก ยังคงฉันไม่คาดหวังไดเรกทอรีกล่าวถึง-cจะถูกลบออกแม้กระทั่งถ้า tarไม่ไดเรกทอรีลบเช่นกัน (สำหรับฉันมันจะเหมือนกับการลบไดเรกทอรีปัจจุบันดังนั้นรวมถึงการเก็บถาวรเองเมื่อไม่ได้ใช้-c... ?) แต่ถ้า-remove-filesปล่อยให้ไดเรกทอรีอยู่กับที่อยู่แล้ว ;-)
Arjan

3
--remove-filestar-1.19ข้อผิดพลาดได้รับการแก้ไขใน
x-yuri

19

เนื่องจาก--remove-filesตัวเลือกจะลบเฉพาะไฟล์คุณสามารถลองได้

tar -cvf files.tar my_directory && rm -R my_directory

ดังนั้นไดเรกทอรีจะถูกลบออกเฉพาะในกรณีที่tarส่งกลับสถานะการออกเป็น 0


9
ยกเว้นว่าคุณควรตรวจสอบสถานะทางออกของ tar ก่อนที่จะทำ rm! ฉะนั้นคุณอาจจะถูกทิ้งไว้โดยไม่มีการเก็บ tar และไฟล์ไม่ ...
คิม

1
เมื่อใช้ไดเรกทอรีระดับหนึ่งฉันเชื่อว่าตัวเลือกที่ปลอดภัยกว่าคือการใช้ 'rmdir' แทนที่จะเป็น 'rm' เนื่องจากจะลบเฉพาะไดเรกทอรีที่ว่างเปล่า [ดูการแก้ไขคำถาม]
Nicholas

แต่rmdirลบไดเรกทอรีที่ว่างเปล่าเท่านั้น ความคิดคือการลบไดเรกทอรีและไฟล์ในนั้น (ให้tarประสบความสำเร็จ)
pavium

--remove-filestar-1.19ข้อผิดพลาดได้รับการแก้ไขใน
x-yuri

&& จะเรียกใช้คำสั่งต่อไปนี้หากคำสั่งก่อนหน้าออกจาก 0 (สำเร็จ) หากออกจาก> 0 คำสั่งต่อไปนี้จะไม่ทำงาน คุณสามารถย้อนกลับด้วย | | - รันต่อเมื่อคำสั่งแรกล้มเหลว วิธีที่ดีในการตรวจสอบเนื้อหาที่แย่เริ่มต้นใหม่
Kirrus

6

คุณได้ลองใส่คำสั่ง - ลบไฟล์หลังจากชื่อไฟล์เก็บถาวรแล้วหรือยัง? มันใช้งานได้สำหรับฉัน

tar -cvf files.tar --remove-files my_directory

1
มีแนวโน้มว่าพฤติกรรมของ tar เปลี่ยนไปเนื่องจากคำถามนี้ถูกวางไว้ สำหรับฉันไม่มีความแตกต่างในการวาง--remove-filesก่อนหรือหลังmy_directory; ในทั้งสองกรณีไดเรกทอรีจะถูกลบออก
redburn

5
--remove-filestar-1.19ข้อผิดพลาดได้รับการแก้ไขใน
x-yuri

1
source={directory argument}

เช่น

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

เช่น

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

จากนั้นคุณสามารถดำเนินการบางอย่างตามแนวของ:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi

1

นี่อาจเป็นข้อผิดพลาด

นอกจากนี้คำว่า "ไฟล์" ยังคลุมเครือในกรณีนี้ แต่เพราะนี่เป็นสวิตช์บรรทัดคำสั่งฉันคาดหวังว่าจะหมายถึงไดเรกทอรีด้วยเพราะใน unix / lnux ทุกอย่างเป็นไฟล์และเป็นไดเรกทอรีด้วย (การตีความอื่น ๆ นั้นแน่นอนเช่นกัน แต่ก็ไม่สมเหตุสมผลที่จะเก็บไดเรกทอรีในกรณีเช่นนี้ฉันจะพิจารณาว่ามันไม่คาดคิดและมีพฤติกรรมที่สับสน)

แต่ฉันได้พบว่าใน gnu tar ในการแจกแจงบางอย่าง gnu tar จริงลบไดเรกทอรีต้นไม้ ข้อบ่งชี้อีกประการหนึ่งว่าการดูแลต้นไม้นั้นเป็นแมลง หรืออย่างน้อยก็แก้ปัญหาบางอย่างจนกว่าพวกเขาจะแก้ไข

นี่คือสิ่งที่ฉันลองบนคอนโซล Ubuntu 10.04:

mit: / var / tmp $ mkdir tree1                                                                                               
mit: / var / tmp $ mkdir tree1 / sub1                                                                                          
mit: / var / tmp $> tree1 / sub1 / file1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 รูท 4096 2011-11-14 15:40                                                                              
drwxr-xr-x 16 root root 4096 2011-02-25 03:15 ..
drwxr-xr-x 3 mit 4096 2011-11-14 15:40 tree1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / - ลบไฟล์

# อย่างที่คุณเห็นต้นไม้ได้หายไปแล้ว:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 รูทราก 4096 2011-11-14 15:41
drwxr-xr-x 16 root root 4096 2011-02-25 03:15 ..
-rw-r - r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz                                                                   


mit: / var / tmp $ tar - รุ่น                                                                                             
tar (GNU tar) 1.22                                                                                                           
ลิขสิทธิ์© 2009 มูลนิธิซอฟต์แวร์เสรี, Inc.

หากคุณต้องการที่จะเห็นมันบนเครื่องของคุณให้วางสิ่งนี้ลงในคอนโซลด้วยความเสี่ยงของคุณเอง:

น้ำมันดิน - รุ่น                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> tree1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.