tar ไฟล์จากไดเรกทอรีอื่นโดยไม่คัดลอก


10

นี่ควรจะง่ายมากสำหรับผู้เชี่ยวชาญที่นี่

ฉันมีบัญชี Linux พร้อมโควต้าดิสก์ผู้ใช้เพียง 6GB มีโฟลเดอร์ข้อมูลบางส่วนที่มีข้อมูล/optประมาณ 3GB เมื่อบีบอัดขึ้นมา 1GB data-folderมีบางอย่างที่เชื่อมโยงสัญลักษณ์อยู่ภายใน โดยปกติแล้วสำหรับการสำรองข้อมูลการทำงานฉันใช้ในการทำดังต่อไปนี้

cp -rvfL /opt/data-folder ~/
cd ~/
tar -zcvf data-folder.tar.gz data-folder
rm -rvf data-folder

ตอนนี้ผมมีการบริโภคอยู่แล้ว 2.5GB ในโควต้าของฉันดิสก์ของผู้ใช้ผมมีพื้นที่พอเพียงที่จะคัดลอกไฟล์ไปที่บ้านของฉัน แต่ไม่ถึงtarมันอีกครั้ง

มีวิธีการ tar และคัดลอกโฟลเดอร์ด้วยคำสั่งเดียวพูดโดยใช้ไพพ์

PS ฉันไม่สามารถน้ำมันดินใน/optเพราะฉันมีเพียง /optแต่การเข้าถึงการอ่านเพื่อ


แน่นอนคุณสามารถ tar ใน / opt คุณไม่สามารถเขียนนั่นนั่นคือทั้งหมด การตั้งค่าสถานะ 'f' เพื่อ tar (3) บอกว่าจะฝากผลลัพธ์ไว้ในไฟล์นั้นซึ่งอาจเป็นที่อื่นได้ cd /opt; tar zcf $HOME/junk.tar.gz junkกล่าวคือ
vonbrand

คำตอบ:


5

คุณต้องการสร้างไฟล์ tar จากตำแหน่งที่ไฟล์ที่คุณต้องการใช้ tar อยู่หรือไม่

มีหลายวิธีในการทำเช่นนี้

ถ้ามันจะถูกสร้างขึ้นภายใน (= บนเครื่องเดียวกัน):

tar czvf /path/to/destination/newfile.tar.gz  ./SOURCEDIR_OR_FILES

คุณสามารถเพิ่มไฟล์หรือไดเรกทอรีเพิ่มเติมเพื่อ tar ที่ท้ายคำสั่งนั้น

ถ้าจะสร้างจากระยะไกล (เช่นคุณต้องการสร้างไฟล์ tar บนโฮสต์ระยะไกลจากที่มีข้อมูลที่จะทดสอบ):

tar czvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cat > newfile.tar.gz'

รุ่นที่ใหม่กว่ามีความหลากหลายมาก ตัวอย่างเช่นคุณสามารถ "ทำซ้ำ" ไดเรกทอรี + ย่อยโดยใช้เทคนิคเดียวกัน:

ทำซ้ำไดเรกทอรี + ย่อยไปยังไดเรกทอรีท้องถิ่นอื่น:

tar cf - ./SOURCEDIR_OR_FILES | ( cd LOCAL_DEST_DIR && tar xvf - )

ทำซ้ำไดเรกทอรี + ส่วนย่อยไปยังไดเรกทอรีระยะไกลอื่น:

tar cvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cd REMOTE_DEST_DIR && tar xf - '

วาง 'v' หากคุณไม่ต้องการให้แสดงไฟล์เนื่องจากเป็น tar-ed (หรือ untarred): จากนั้นจะเร็วขึ้นมาก แต่จะไม่พูดมากนักหากมีข้อผิดพลาด

ฉันใช้ ". / ... " สำหรับแหล่งที่มาเพื่อบังคับ tar เพื่อเก็บไว้เป็นเส้นทางที่เกี่ยวข้อง ในบางกรณีคุณจะต้องเพิ่มข้อมูลเส้นทางเพิ่มเติม:

ตัวอย่างเช่นการ tar ไฟล์ crontab รวมถึงไฟล์ใน / etc คุณสามารถทำได้:

cd / ; tar czf all_crons.tgz  ./etc/*cron*  ./var/spool/cron

ฉันใช้ตามวัตถุประสงค์เส้นทางสัมพัทธ์: tar บางรุ่นอาจมีอันตรายและแตกไฟล์ด้วยเส้นทาง GLOBAL ดั้งเดิมซึ่งหมายความว่าคุณสามารถทำได้: cd /safedir ; tar xvf sometarและมีไฟล์ที่มีชื่อโกลบอลเขียนทับไฟล์ที่เส้นทางเดิมซึ่งอยู่นอก / safedir และไม่อยู่ข้างใต้! อันตรายมากและยังคงเป็นไปได้เนื่องจากมีเซิร์ฟเวอร์การผลิตเก่าอยู่ ดีกว่าที่จะใช้ในการใช้เส้นทางสัมพัทธ์ตลอดเวลาแม้ว่าคุณจะใช้น้ำมันดินที่ใหม่กว่า


ข้อแตกต่างระหว่าง tars: สำหรับบางคนที่คุณอาจต้องใช้-cvfแทนcvfคนอื่น ๆ จะไม่รู้จัก-สไตล์ และzใช้เพื่อหมายถึง "การบีบอัดด้วย 'การบีบอัด'" แต่บน tar 'ล่าสุด' หมายความว่า "การบีบอัดด้วย gzip" file zefileคุณสามารถทราบว่าการบีบอัดจะถูกใช้ในไฟล์ที่มี: และเปลี่ยนชื่อตามนั้น (หาก tar ของคุณใช้compressควรเปลี่ยนชื่อเป็น. tar.Z ไม่ใช่. tar.gz)
Olivier Dulac

0

ใช้-hตัวเลือก tar จากหน้าคน:

-h, --dereference
don't archive symlinks; archive the files they point to

เพื่อให้คุณสามารถใช้ tar -zcvfh data-folder.tar.gz /opt/data-folder


โอ้ฉันควรจะพูดถึงมันฉันได้ลอง tar -zcvfh ~ / data-folder.tar.gz / opt / data-folder แล้ว ฉันกำลังประสบปัญหาการเก็บถาวรแบบวงกลมบางประเภท ฉันคัดลอกไฟล์บางไฟล์ไปเรื่อย ๆ และไม่สิ้นสุด
Kamath

ดูเหมือนว่ามีลิงก์สัญลักษณ์แบบวงกลมในโฟลเดอร์ย่อยของข้อมูล
Kamath

2
@AUZKamath นั่นเป็นข้อผิดพลาดใน GNU tar คุณอาจต้องการลองbsdtarแทนหรือpax( cd /opt && pax -Lw data-folder | gzip > ~/data-folder.tar.gz) ซึ่งจะตรวจจับลูป
Stéphane Chazelas

1
@AUZKamath คุณสามารถ tar และลบไฟล์ออกจากโฮมไดเร็กตอรี่ของคุณที่ใช้tar -rf <tarfilename> <filename>เพื่อเพิ่มลงในไฟล์ tar ที่มีอยู่
harish.venkat

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