เชลล์คำสั่งไปยังไดเรกทอรี tar ยกเว้นไฟล์ / โฟลเดอร์บางอย่าง


810

มีคำสั่งเชลล์ / สคริปต์แบบธรรมดาที่สนับสนุนการแยกไฟล์ / โฟลเดอร์บางไฟล์ออกจากการเก็บถาวรหรือไม่?

ฉันมีไดเรกทอรีที่ต้องเก็บถาวรด้วยไดเรกทอรีย่อยที่มีจำนวนไฟล์ที่มีขนาดใหญ่มากฉันไม่จำเป็นต้องสำรองข้อมูล

ไม่ใช่วิธีแก้ปัญหา:

tar --exclude=PATTERNคำสั่งตรงกับรูปแบบที่กำหนดและไม่รวมไฟล์เหล่านั้น แต่ฉันต้องการเฉพาะไฟล์และโฟลเดอร์ที่จะละเลย (เส้นทางของไฟล์เต็ม) มิฉะนั้นไฟล์ที่ถูกต้องอาจจะได้รับการยกเว้น

ฉันยังสามารถใช้คำสั่ง find เพื่อสร้างรายการไฟล์และแยกไฟล์ที่ฉันไม่ต้องการเก็บถาวรและส่งต่อรายการให้ tar แต่ก็ใช้ได้กับไฟล์จำนวนเล็กน้อยเท่านั้น ฉันมีหมื่น

ฉันเริ่มคิดว่าทางออกเดียวคือการสร้างไฟล์ที่มีรายการไฟล์ / โฟลเดอร์ที่จะแยกออกจากนั้นใช้ rsync ด้วย--exclude-from=fileเพื่อคัดลอกไฟล์ทั้งหมดไปยังไดเรกทอรี tmp แล้วใช้ tar เพื่อเก็บถาวรไดเรกทอรีนั้น

ใครสามารถคิดวิธีที่ดีกว่า / มีประสิทธิภาพมากกว่านี้ได้ไหม

แก้ไข: ทางออกของCharles Maทำงานได้ดี gotcha ขนาดใหญ่คือ--exclude='./folder' ต้องอยู่ที่จุดเริ่มต้นของคำสั่ง tar คำสั่งแบบเต็ม (cd ก่อนดังนั้นการสำรองข้อมูลจึงสัมพันธ์กับไดเรกทอรีนั้น):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

120
อีกสิ่งหนึ่งที่ทำให้ฉันรู้ว่าอาจเป็นสิ่งที่ควรค่าแก่การจดบันทึก: เครื่องหมายทับท้ายที่ท้ายโฟลเดอร์ที่แยกจะทำให้ tar ไม่แยกโฟลเดอร์เหล่านั้นเลย
Rekhyt

7
@ Rekhyt ขอบคุณฉันกำลังจ้องที่คำสั่งเป็นเวลา 15 นาที ... แล้ว 30
earcam

9
ดูเหมือนว่าตำแหน่งของ - ไม่รวมขึ้นอยู่กับรุ่นของ tar สำหรับ tar 1.23 - ไม่จำเป็นต้องมาหลังจากคำสั่งหลัก
Joel G Mathew

2
อย่าลืมเครื่องหมาย "" (เครื่องหมายคำพูด)
Meetai.com

3
--excludeไม่จำเป็นต้องมาก่อน แต่ต้องมาก่อนที่ไดเรกทอรีต้นทาง (ทดสอบกับ tar 1.29 บน Cygwin)
wortwart

คำตอบ:


1038

คุณสามารถมีตัวเลือกไม่รวมหลายตัวเลือกสำหรับ tar ดังนั้น

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

ฯลฯ จะทำงาน ตรวจสอบให้แน่ใจ--exclude ก่อนใส่รายการต้นทางและปลายทาง


78
คำตอบนี้ทำให้ดูเหมือน --exclude มาก่อน ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. git'
James O'Brien

13
ตัวอย่างเช่นหากคุณกำลังพยายามสำรองข้อมูลโฟลเดอร์ wordpress project ของคุณไม่รวมโฟลเดอร์อัพโหลดคุณสามารถใช้คำสั่งนี้: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content /
upload

12
ฉันมากับคำสั่งต่อไปนี้: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . โปรดทราบว่า-fธงต้องนำหน้าไฟล์ tar ดู: superuser.com/a/559341/415047
อัลเฟรด Bez

21
"/" ที่ส่วนท้ายของไดเรกทอรีแยกจะทำให้มันล้มเหลว ฉันเดา tar คิดว่าตอนจบ / เป็นส่วนหนึ่งของชื่อไดเรกทอรีที่จะยกเว้น BAD: - exclude = mydir / GOOD: --exclude = mydir
Josiah

4
> ตรวจสอบให้แน่ใจว่าได้ใส่ - ไม่รวมหน้ารายการต้นทางและปลายทาง หรือใช้เส้นทางที่แน่นอนสำหรับการแยก: tar -cvpzf backups / target.tar.gz --exclude = '/ home / ชื่อผู้ใช้ / ข้อมูลสำรอง' / home / ชื่อผู้ใช้
NightKnight บน Cloudinsidr.com

131

คุณสามารถยกเว้นไดเรกทอรีด้วย--excludeสำหรับ tar

หากคุณต้องการเก็บถาวรทุกอย่างยกเว้น/usrคุณสามารถใช้:

tar -zcvf /all.tgz / --exclude=/usr

ในกรณีของคุณอาจจะมีบางอย่างเช่น

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

17
เพื่อชี้แจงคุณสามารถใช้เส้นทางแบบเต็มสำหรับ - ไม่รวม
Johan Soderberg

2
ในบางกรณีก็เป็นสิ่งจำเป็นที่ไม่รวมนำไฟล์ / โฟลเดอร์เพื่อเก็บ
kronuus

68

ตัวเลือกที่เป็นไปได้เพื่อแยกไฟล์ / ไดเรกทอรีออกจากการสำรองข้อมูลโดยใช้ tar:

ไม่รวมไฟล์โดยใช้หลายรูปแบบ

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

ยกเว้นไฟล์ที่ใช้ไฟล์แยกที่เต็มไปด้วยรายการรูปแบบ

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

ยกเว้นไฟล์โดยใช้แท็กโดยวางไฟล์แท็กในไดเรกทอรีใด ๆ ที่ควรข้าม

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup

3
การเรียงลำดับพารามิเตอร์ดูเหมือนจะสำคัญและแบบฟอร์มนี้ใช้ได้สำหรับฉัน
cstamas

1
ฉันด้วย. สำหรับ tar (GNU tar) 1.28 บน Ubuntu 16.04 เฉพาะการเรียงลำดับพารามิเตอร์เฉพาะเท่านั้นที่ใช้งานได้
alvaroreig

43

คำถามเก่าที่มีคำตอบมากมาย แต่ฉันพบว่าไม่มีใครชัดเจนพอสำหรับฉันดังนั้นฉันจึงอยากลองเพิ่ม

หากคุณมีโครงสร้างดังต่อไปนี้

/home/ftp/mysite/

ด้วยไฟล์ / โฟลเดอร์ต่อไปนี้

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

ดังนั้นคุณต้องการสร้างไฟล์ tar ที่มีทุกอย่างภายใน / home / ftp / mysite (เพื่อย้ายเว็บไซต์ไปยังเซิร์ฟเวอร์ใหม่) แต่file3เป็นเพียงขยะและทุกสิ่งในfolder3นั้นก็ไม่จำเป็นดังนั้นเราจะข้ามสองสิ่งนี้

เราใช้รูปแบบ

tar -czvf <name of tar file> <what to tar> <any excludes>

โดยที่ c = create, z = zip, และ v = verbose (คุณสามารถดูไฟล์ที่ถูกป้อนเข้าไปได้, มีประโยชน์เพื่อให้แน่ใจว่าไม่มีไฟล์ใดที่คุณไม่รวมอยู่) และ f = ไฟล์

ดังนั้นคำสั่งของฉันจะมีลักษณะเช่นนี้

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

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

หวังว่านี้จะช่วยให้ใครบางคน (และฉันในครั้งต่อไปฉัน google มัน)


6
คำตอบนี้ช่วยฉันได้อย่างแน่นอน! gotcha สำหรับฉันคือคำสั่งของฉันดูเหมือนอะไรบางอย่างtar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'และนี่ก็ไม่ได้แยกอะไร
Anish Ramaswamy

2
ตัวอย่างของคุณคล้ายกับสิ่งที่ฉันมีปัญหามาก! ขอบคุณ!
Qorbani

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

2
นี่คือคำตอบที่ชัดเจนมากขึ้น เพราะตัวอย่างฉันสามารถทำให้มันทำงานได้เพราะเส้นทางสับสนในตอนแรก ขอบคุณมัด!
fagiani

2
มันใช้งานได้! โปรดจำไว้ว่าอย่าเพิ่มสแลชต่อท้ายลงในการยกเว้น ตัวอย่างเช่นในขณะที่ "file3" หรือ "file3 / โฟลเดอร์ย่อย" ทำงานได้ "file3 /" และ "file3 / โฟลเดอร์ย่อย /" ไม่!
lucaferrario

24

คุณสามารถใช้ "ant antation" มาตรฐานเพื่อแยกไดเรกทอรีที่สัมพันธ์กันได้
สิ่งนี้ใช้ได้กับฉันและไม่รวมไดเร็กทอรี. git หรือ node_module:

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt ประกอบด้วย:

/ dev2 / java
/ dev2 / javascript


4
ฉันเชื่อว่าสิ่งนี้ต้องการให้ตัวแปร Bash shell เป็นตัวเลือกglobstarที่จะเปิดใช้งาน shopt -s globstarตรวจสอบกับ ฉันคิดว่ามันปิดโดยปริยายบนระบบปฏิบัติการยูนิกซ์ส่วนใหญ่ จากคู่มือ Bash: " globstar: ถ้าตั้งค่ารูปแบบที่**ใช้ในบริบทการขยายชื่อไฟล์จะจับคู่ไฟล์ทั้งหมดและเป็นศูนย์หรือไดเรกทอรีและไดเรกทอรีย่อยหรือมากกว่าถ้ารูปแบบตามด้วย '/' เฉพาะไดเรกทอรีและไดเรกทอรีย่อยที่ตรงกัน "
not2qubit

15

ฉันพบว่าอย่างน้อยกับtar รุ่นCygwin ที่ฉันกำลังใช้ ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" ใน Windows XP Home Edition เครื่อง SP3) ลำดับของตัวเลือกมีความสำคัญ

ในขณะที่การก่อสร้างนี้เหมาะกับฉัน:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

ที่ไม่ทำงาน:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

นี้ในขณะที่tar --helpเผยให้เห็นต่อไปนี้:

tar [OPTION...] [FILE]

ดังนั้นคำสั่งที่สองควรทำงานได้ แต่ดูเหมือนจะไม่เป็นเช่นนั้น ...

rgds ที่ดีที่สุด


5
เพียงต้องการเพิ่มในข้างต้นเป็นสิ่งสำคัญที่ไดเรกทอรีที่จะแยกควรไม่ประกอบด้วยแบ็กสแลชสุดท้าย ดังนั้นไม่รวม = '/ เส้นทาง / เพื่อ / ยกเว้น / dir'เป็นที่ถูกต้อง , ไม่รวม = '/ เส้นทาง / เพื่อ / ยกเว้น / dir /'เป็นผิด
GeertVc

17
นี่เป็นเพราะเป้าหมายการเก็บถาวร target.tgz เป็นอาร์กิวเมนต์ของสวิตช์ f ซึ่งควรปฏิบัติตาม
Valentino

14

รูปแบบที่ไม่รวมนี้จัดการส่วนต่อท้ายชื่อไฟล์เช่น png หรือ mp3 รวมถึงชื่อไดเรกทอรีเช่น. git และ node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}

ขอบคุณ - นั่นคือสิ่งที่ฉันกำลังมองหา :)
Alexander Br

11

สำหรับผู้ที่มีปัญหา tar บางรุ่นจะทำงานได้อย่างถูกต้องหากไม่มี './' ในค่าที่แยกออก

Tar --version

tar (GNU tar) 1.27.1

ไวยากรณ์คำสั่งที่ใช้งานได้:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

สิ่งเหล่านี้จะไม่ทำงาน:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *

10

ฉันพบสิ่งนี้ที่อื่นดังนั้นฉันจะไม่รับเครดิต แต่มันทำงานได้ดีกว่าวิธีการแก้ปัญหาด้านบนสำหรับปัญหาเฉพาะของ mac (แม้ว่าจะปิดอยู่):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>

2
ขอบคุณสำหรับคำตอบนี้ tar ในดาร์วินมีไวยากรณ์ที่แตกต่างกันอย่างแน่นอนและมันทำให้ฉันสับสนทำไม "--exclude = blah" ในคำตอบอื่น ๆ ไม่ทำงาน วิธีนี้ใช้งานได้ดีบน mac
ไมเคิล

1
อย่าลืมCOPYFILE_DISABLE=1เมื่อใช้ tar มิฉะนั้นคุณอาจได้รับไฟล์. _ ไฟล์ใน tarball ของคุณ
เบอนัวต์ดัฟเช่

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

8

สำหรับ Mac OSX ฉันต้องทำ

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

หมายเหตุ-fหลัง--exclude=


6

ฉันยอมรับธง - ไม่รวมเป็นวิธีการที่เหมาะสม

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

คำเตือนสำหรับผลข้างเคียงที่ฉันไม่พบชัดเจนทันที: การยกเว้น 'fileA' ในตัวอย่างนี้จะค้นหา 'fileA' recursively!

ตัวอย่าง: ไดเรกทอรีที่มีไดเรกทอรีย่อยเดียวที่มีไฟล์ชื่อเดียวกัน (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • หากมีการใช้--exclude='data.txt'ข้อมูลที่เก็บจะไม่ได้มีทั้งที่ไฟล์ data.txt สิ่งนี้อาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดหากเก็บถาวรไลบรารีบุคคลที่สามเช่นไดเร็กทอรี node_modules

  • เพื่อหลีกเลี่ยงปัญหานี้ให้แน่ใจว่าจะให้เส้นทางทั้งหมดเช่น --exclude='./dirA/data.txt'


5

เพื่อหลีกเลี่ยงความเป็นไปได้'xargs: Argument list too long'ข้อผิดพลาดที่เกิดจากการใช้ของfind ... | xargs ...เมื่อการประมวลผลนับหมื่นของไฟล์ที่คุณสามารถท่อส่งออกของfindโดยตรงกับการใช้tarfind ... -print0 | tar --null ...

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -

คุณสามารถอ้างอิงสตริง 'แยก' เช่นนี้: 'somedir / filesdir / *' จากนั้นเชลล์จะไม่ขยายเครื่องหมายดอกจันและตัวอักษรสีขาวอื่น ๆ
Znik

xargs -n 1เป็นตัวเลือกอื่นเพื่อหลีกเลี่ยงxargs: Argument list too longข้อผิดพลาด;)
Tuxdude

5

หลังจากอ่านกระทู้นี้ฉันได้ทำการทดสอบเล็กน้อยเกี่ยวกับ RHEL 5 และนี่คือผลลัพธ์ของฉันสำหรับการทำไดเรกทอรี abc:

สิ่งนี้จะแยกข้อผิดพลาดของไดเรกทอรีและบันทึกและไฟล์ทั้งหมดภายใต้ไดเรกทอรี:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

การเพิ่มไวด์การ์ดหลังจากไดเร็กทอรีที่ถูกแยกจะแยกไฟล์ แต่เก็บรักษาไดเร็กทอรี:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'

ในตัวอย่างที่สองข้างต้นควรมีเครื่องหมายดอกจันหลังจากสแลชสุดท้ายในแต่ละข้อยกเว้น แต่โพสต์ไม่ได้ใช้
Mike

4

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

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;

4

คุณยังสามารถใช้หนึ่งในตัวเลือก "--exclude-tag" ตามความต้องการของคุณ:

  • ไม่รวมแท็ก = FILE
  • ไม่รวมแท็กทั้งหมด = FILE
  • ไม่รวมแท็กภายใต้ = FILE

โฟลเดอร์ที่โฮสต์ไฟล์ที่ระบุจะถูกยกเว้น


4

หลังจากอ่านคำตอบที่ดีทั้งหมดสำหรับเวอร์ชันที่แตกต่างกันและหลังจากได้แก้ไขปัญหาให้ตัวเองแล้วฉันคิดว่ามีรายละเอียดเล็ก ๆ น้อย ๆ ที่สำคัญมากและหายากสำหรับการใช้ทั่วไปของ GNU / Linuxที่ไม่ค่อยเครียดพอและสมควรมากกว่าความคิดเห็น

ดังนั้นฉันจะไม่พยายามตอบคำถามทุกกรณี แต่ให้ลองลงทะเบียนว่าจะดูเมื่อสิ่งต่าง ๆ ไม่ทำงาน

มันสำคัญมากที่จะต้องสังเกต:

  1. คำสั่งของตัวเลือกเรื่อง:มันไม่เหมือนกัน - - รวมก่อนหน้ากว่าหลังจากตัวเลือกไฟล์และไดเรกทอรีเพื่อสำรองข้อมูล นี่เป็นสิ่งที่คาดไม่ถึงอย่างน้อยสำหรับฉันเพราะในประสบการณ์ของฉันในคำสั่ง GNU / Linux มักจะลำดับของตัวเลือกไม่สำคัญ
  2. รุ่น tar ที่แตกต่างกันคาดว่าตัวเลือกนี้จะเรียงตามลำดับที่แตกต่างกันตัวอย่างเช่นคำตอบของ @ Andrewระบุว่าใน GNU tar v 1.26 และ 1.28 การแยกออกมาครั้งสุดท้าย
  3. SLASHES SLILES เรื่อง : อย่างน้อยใน GNU tar 1.29 ไม่ควรมีมันไม่ควรจะเป็นใด ๆ

ในกรณีของฉันสำหรับ GNU tar 1.29 สำหรับ Debian stretch คำสั่งที่ใช้งานได้

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

คำพูดไม่สำคัญว่ามันทำงานได้กับหรือไม่มีพวกเขา

ฉันหวังว่านี่จะเป็นประโยชน์กับใครบางคน


ขอบคุณสำหรับคำตอบ. ฉันกำลังมองหา (สิ่งที่รู้สึกเหมือนเป็นเวลานานมาก) สำหรับการแก้ปัญหาและคำตอบของคุณแนะนำฉันในทิศทางที่ถูกต้อง อย่างไรก็ตามในกรณีของฉัน (Ubuntu 18.04.3, Tar 1.29) ฉันทำได้เพียงเพิ่มชื่อโฟลเดอร์ไม่ใช่เส้นทางเช่น: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve โฟลเดอร์ tgz
Nitai

2

คุณสามารถใช้ cpio (1) เพื่อสร้างไฟล์ tar cpio นำไฟล์ไปเก็บถาวรบน stdin ดังนั้นหากคุณหาคำสั่ง find ที่คุณต้องการใช้เพื่อเลือกไฟล์ที่เก็บถาวรแล้วไพพ์ลงใน cpio เพื่อสร้างไฟล์ tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz

2

gnu tar v 1.26 - ไม่จำเป็นต้องมาหลังจากไฟล์เก็บถาวรและอาร์กิวเมนต์ไดเรกทอรีสำรองควรไม่มีเครื่องหมายทับหรือต่อท้ายและไม่ต้องการราคา (เดี่ยวหรือคู่) ดังนั้นเมื่อเทียบกับไดเรกทอรี PARENT ที่จะทำการสำรองข้อมูลก็คือ:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude


tar (GNU tar) 1.28หลังจากการทดลองมากที่ฉันได้พบมากหรือน้อยสิ่งเดียวกันกับคำสั่งของฉันใน
PicoutputCls

2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X หมายถึงไฟล์ที่มีรายการชื่อไฟล์ซึ่งจะต้องแยกออกจากการสำรองข้อมูล สำหรับอินสแตนซ์คุณสามารถระบุ * ~ ในไฟล์นี้เพื่อไม่รวมชื่อไฟล์ใด ๆ ที่ลงท้ายด้วย ~ ในการสำรองข้อมูล


ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดเพราะสามารถใช้งานได้ในกรณีเหล่านั้นว่าจำนวนการแยกมีขนาดใหญ่ นอกจากนี้ยังเป็นไปได้ที่จะรวมตัวเลือก X ในแพ็คตัวเลือกดังนั้นรูปแบบที่สั้นที่สุดน่าจะเป็น:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
ไก่ Petzke

0

ทางออกที่ดีที่สุดของคุณคือใช้ find with tar ผ่าน xargs (เพื่อจัดการอาร์กิวเมนต์จำนวนมาก) ตัวอย่างเช่น:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

4
ซึ่งอาจทำให้ tar ถูกเรียกหลายครั้ง - และจะแพ็คไฟล์ซ้ำ ๆ ถูกต้องคือ:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen

ฉันอ่านที่ไหนสักแห่งว่าเมื่อใช้xargsงานเราควรใช้rตัวเลือกtar แทนcเพราะเมื่อfindพบการโหลดผลลัพธ์จริง ๆ xargs จะแยกผลลัพธ์เหล่านั้น (ขึ้นอยู่กับขีด จำกัด บรรทัดคำสั่งอาร์กิวเมนต์ในเครื่อง) เป็น chuncks และเรียกใช้ tar ในแต่ละส่วน สิ่งนี้จะส่งผลให้เกิดการเก็บถาวรที่มี chunck สุดท้ายที่ส่งคืนโดยxargsไม่ใช่ผลลัพธ์ทั้งหมดที่พบโดยfindคำสั่ง
Stphane

0

คำตอบที่ซ้ำซ้อนที่เป็นไปได้ แต่เนื่องจากฉันพบว่ามีประโยชน์นี่คือ:

ในขณะที่รูท FreeBSD (เช่นใช้ csh) ฉันต้องการคัดลอกระบบไฟล์รูททั้งหมดไปยัง / mnt แต่ไม่มี / usr และ (ชัด) / mnt นี่คือสิ่งที่ใช้งานได้ (ฉันอยู่ที่ /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

จุดทั้งหมดของฉันคือมันเป็นสิ่งจำเป็น (โดยการใส่. / ) เพื่อระบุว่า tar ซึ่งเป็นไดเรกทอรีที่ไม่รวมซึ่งเป็นส่วนหนึ่งของไดเรกทอรีที่ใหญ่กว่าที่จะถูกคัดลอก

ของฉัน 0.02 €


0

ฉันไม่มีโชคที่ได้รับ tar ที่จะแยกไดเรกทอรีย่อย 5 Gigabyte ลึกไม่กี่ระดับ ในที่สุดฉันเพิ่งใช้คำสั่ง unix Zip มันทำงานได้ง่ายขึ้นมากสำหรับฉัน

ดังนั้นสำหรับตัวอย่างนี้จากโพสต์ต้นฉบับ
(tar --exclude = '. / folder' --exclude = '. / upload / folder2' -zcvf /backup/filename.tgz.)

เทียบเท่าจะเป็น:

zip -r /backup/filename.zip -x upload / folder / ** \ * upload / folder2 / ** \ *

(หมายเหตุ: นี่คือโพสต์ที่ฉันใช้ แต่เดิมซึ่งช่วยฉัน/superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )


3
ระวัง: zipไม่ได้แพ็คไดเรกทอรีว่างเปล่า แต่tarไม่ได้!
t0r0X


0

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

บีบอัดโฟลเดอร์เชิงมุมจาก / var / lib / tomcat7 / webapps ย้ายไปที่โฟลเดอร์ / tmp ด้วยชื่อ angular.23.12.19.tar.gz

คำสั่ง:

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/

0

กรณีที่ประสบความสำเร็จ: 1) หากให้เส้นทางแบบเต็มเพื่อสำรองข้อมูลในการแยกควรใช้เส้นทางแบบเต็ม

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / บันทึก / ' / opt / ABC

2) หากให้เส้นทางปัจจุบันเพื่อสำรองข้อมูลในการแยกควรใช้เส้นทางปัจจุบันเท่านั้น

tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC

กรณีความล้มเหลว:

  1. ถ้าให้ไดเรกทอรีพา ธ ปัจจุบันเพื่อสำรองข้อมูลและพา ธ เต็มเพื่อเพิกเฉยไม่ทำงาน

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / บันทึก / ' ABC

หมายเหตุ: การกล่าวถึงไม่รวมก่อน / หลังไดเรกทอรีสำรองก็ใช้ได้


0

หากคุณพยายามที่จะไม่รวมไฟล์ Version Control System (VCS) tar อยู่แล้วสนับสนุนสองตัวเลือกที่น่าสนใจเกี่ยวกับมัน! :)

  1. ตัวเลือก: - ยกเว้น -csc

นี้ไฟล์ตัวเลือกไม่รวมและไดเรกทอรีที่ใช้โดยทำตามระบบการควบคุมรุ่น: CVS, RCS, SCCS, SVN,Arch , Bazaar, และMercurialDarcs

ตั้งแต่เวอร์ชัน 1.32 ไฟล์ดังต่อไปนี้ถูกแยกออก:

  • CVS/และทุกอย่างภายใต้มัน
  • RCS/และทุกอย่างภายใต้มัน
  • SCCS/และทุกอย่างภายใต้มัน
  • .git/และทุกอย่างภายใต้มัน
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/และทุกอย่างภายใต้มัน
  • .arch-ids/และทุกอย่างภายใต้มัน
  • {arch}/และทุกอย่างภายใต้มัน
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. ตัวเลือก: - ยกเว้น -csc- ละเว้น

เมื่อเก็บถาวรไดเรกทอรีที่อยู่ภายใต้ระบบควบคุมเวอร์ชัน (VCS) บางครั้งการอ่านรูปแบบการแยกออกจากไฟล์ที่ไม่สนใจของ VCS นี้ (เช่น .cvsignore , .gitignoreฯลฯ ) ตัวเลือกนี้จะให้ความเป็นไปได้ดังกล่าว

ก่อนที่จะเก็บไดเรกทอรีดูว่ามีไฟล์ใด ๆ ต่อไปนี้: cvsignore, .gitignore,.bzrignore.hgignoreหรือ หากเป็นเช่นนั้นให้อ่านการเพิกเฉยรูปแบบจากไฟล์เหล่านี้

รูปแบบได้รับการปฏิบัติมากที่สุดเท่าที่ VCS ที่สอดคล้องกันจะปฏิบัติต่อพวกเขาเช่น:

.cvsignore

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

.gitignore

มีลวดลายกลมแบบเชลล์ นำไปใช้กับไดเรกทอรีที่.gitfileมีอยู่และไดเร็กทอรีย่อยทั้งหมด

บรรทัดใด ๆ ที่ขึ้นต้นด้วย a #คือความคิดเห็น แบ็กสแลชจะหนีอักขระความคิดเห็น

.bzrignore

มีเชลล์รูปแบบการวนรอบและนิพจน์ทั่วไป (หากนำหน้าด้วย RE: (16))มีผลกับไดเร็กทอรีและไดเร็กทอรีย่อยทั้งหมด

บรรทัดใด ๆ ที่ขึ้นต้นด้วย a #คือความคิดเห็น

.hgignore

มีการแสดงออกปกติ posix (17) สายsyntax: globสลับไปยังรูปแบบการหมุนรอบเปลือก บรรทัดsyntax: regexpสลับกลับ #ความคิดเห็นที่เริ่มต้นด้วย รูปแบบส่งผลกระทบต่อไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด

  1. ตัวอย่าง

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/


-1

สคริปต์ทุบตีต่อไปนี้ควรทำเคล็ดลับ จะใช้คำตอบที่ได้รับที่นี่โดยมาร์คัส Sundman

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

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

เพียงแค่เปลี่ยน * .CC สำหรับส่วนขยายอื่น ๆ ชื่อไฟล์หรือ regex ที่คุณต้องการยกเว้นและยังควรใช้งานได้

แก้ไข

เพียงเพิ่มคำอธิบายเล็กน้อย ค้นหาจะสร้างรายการไฟล์ที่ตรงกับ regex ที่เลือก (ในกรณีนี้ * .CC) รายการนี้ถูกส่งผ่านทาง xargs ไปยังคำสั่ง echo พิมพ์นี้ - ไม่รวม 'หนึ่งรายการจากรายการ' เครื่องหมายทับ () คืออักขระเลี่ยงสำหรับเครื่องหมาย '


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

1
นอกจากนี้สคริปต์ของคุณไม่สามารถใช้กับพา ธ ที่มีช่องว่างหรือเชลล์เมตาอักขระ โดยทั่วไปคุณควรใส่ตัวแปรในเครื่องหมายคำพูดคู่เสมอยกเว้นว่าคุณต้องการให้เชลล์ทำการประมวลผลโทเค็นช่องว่างและการขยายสัญลักษณ์แทน สำหรับรายละเอียดโปรดดูstackoverflow.com/questions/10067266/…
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.