Lệnh Shell đến thư mục tar không bao gồm các tệp / thư mục nhất định


811

Có một lệnh shell / script đơn giản hỗ trợ loại trừ các tệp / thư mục nhất định khỏi được lưu trữ không?

Tôi có một thư mục cần được lưu trữ với một thư mục con có một số tệp rất lớn mà tôi không cần sao lưu.

Không hoàn toàn là giải pháp:

Các tar --exclude=PATTERNlệnh phù hợp với mô hình nhất định và không bao gồm những tác phẩm, nhưng tôi cần file cụ thể và thư mục được bỏ qua (đường dẫn tập tin đầy đủ), nếu không hồ sơ hợp lệ có thể được loại trừ.

Tôi cũng có thể sử dụng lệnh find để tạo danh sách các tệp và loại trừ những tệp tôi không muốn lưu trữ và chuyển danh sách sang tar, nhưng chỉ hoạt động với một lượng nhỏ tệp. Tôi có hàng vạn.

Tôi bắt đầu nghĩ giải pháp duy nhất là tạo một tệp có danh sách các tệp / thư mục cần loại trừ, sau đó sử dụng rsync với --exclude-from=fileđể sao chép tất cả các tệp vào thư mục tmp, sau đó sử dụng tar để lưu trữ thư mục đó.

Bất cứ ai cũng có thể nghĩ về một giải pháp tốt hơn / hiệu quả hơn?

EDIT: Giải pháp của Charles Ma hoạt động tốt. Gotcha lớn là --exclude='./folder' PHẢI ở đầu lệnh tar. Lệnh đầy đủ (đầu tiên là cd, vì vậy sao lưu có liên quan đến thư mục đó):

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

120
Một điều nữa khiến tôi chú ý đến điều đó, có thể đáng lưu ý: Chém dấu gạch chéo ở cuối các thư mục bị loại trừ sẽ khiến tar không loại trừ các thư mục đó.
Rekhyt

7
@Rekhyt cảm ơn, tôi đã nhìn chằm chằm vào lệnh trong 15 phút ... sau đó 30
Earcam

9
Có vẻ như vị trí của --exclude phụ thuộc vào phiên bản tar. Đối với tar 1.23, - bao gồm cần phải xuất hiện sau các lệnh chính.
Joel G Mathew

2
Đừng quên "'" (dấu ngoặc kép).
Meetai.com 7/12/13

3
--excludekhông phải là đầu tiên nhưng nó phải đến một nơi nào đó trước thư mục nguồn (được thử nghiệm với tar 1.29 trên Cygwin).
wortwart

Câu trả lời:


1038

Bạn có thể có nhiều tùy chọn loại trừ cho tar

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

vv sẽ làm việc. Hãy chắc chắn để đặt --exclude trước các mục nguồn và đích.


78
Câu trả lời này làm cho nó trông giống như --exclude xuất hiện đầu tiên ... tar cvfpz ../ ware.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien

13
Ví dụ: nếu bạn đang cố gắng sao lưu thư mục dự án wordpress của mình, ngoại trừ thư mục tải lên, bạn có thể sử dụng lệnh này: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth 27/2/2015

12
Tôi đã đưa ra lệnh sau: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . lưu ý rằng -fcờ cần đặt trước tệp tar xem: superuser.com/a/559341/415047
Alfred Bez

21
Một "/" ở cuối thư mục loại trừ sẽ khiến nó bị lỗi. Tôi đoán tar nghĩ rằng một kết thúc / là một phần của tên thư mục để loại trừ. BAD: --exclude = mydir / TỐT: --exclude = mydir
Josiah

4
> Đảm bảo đặt - ngoại trừ trước các mục nguồn và đích. HOẶC sử dụng một đường dẫn tuyệt đối cho loại trừ: tar -cvpzf sao lưu / target.tar.gz --exclude = '/ home / username / backups' / home / username
NightKnight trên Cloudinsidr.com

131

Bạn có thể loại trừ các thư mục với --excludetar.

Nếu bạn muốn lưu trữ mọi thứ trừ /usrbạn có thể sử dụng:

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

Trong trường hợp của bạn có lẽ một cái gì đó như

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

17
Để làm rõ, bạn có thể sử dụng đường dẫn đầy đủ cho --exclude.
Johan Soderberg

2
trong một số trường hợp, yêu cầu - bao gồm trước các tệp / thư mục để lưu trữ
kronuus

68

Các tùy chọn có thể để loại trừ các tệp / thư mục khỏi bản sao lưu bằng tar:

Loại trừ các tệp bằng nhiều mẫu

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

Loại trừ các tệp bằng cách sử dụng tệp loại trừ chứa đầy danh sách các mẫu

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

Loại trừ các tệp bằng cách sử dụng thẻ bằng cách đặt tệp thẻ vào bất kỳ thư mục nào cần được bỏ qua

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

3
Thứ tự của các tham số dường như có vấn đề và hình thức này làm việc cho tôi.
cstamas

1
Tôi cũng vậy. Đối với tar (GNU tar) 1.28 trên Ubuntu 16.04, chỉ có thứ tự tham số cụ thể này hoạt động.
alvaroreig

43

câu hỏi cũ với nhiều câu trả lời, nhưng tôi thấy rằng không có câu trả lời nào đủ rõ ràng cho tôi, vì vậy tôi muốn thêm thử.

nếu bạn có cấu trúc như sau

/home/ftp/mysite/

với các tập tin / thư mục sau

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

vì vậy, bạn muốn tạo một tệp tar chứa mọi nội dung bên trong / home / ftp / mysite (để di chuyển trang web đến một máy chủ mới), nhưng file3chỉ là rác và mọi thứ trong đófolder3 cũng không cần thiết, vì vậy chúng tôi sẽ bỏ qua hai thứ đó.

chúng tôi sử dụng định dạng

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

trong đó c = create, z = zip và v = verbose (bạn có thể xem các tệp khi chúng được nhập, hữu ích để đảm bảo không có tệp nào bạn loại trừ được thêm vào). và f = tập tin.

vì vậy, lệnh của tôi sẽ như thế này

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

lưu ý các tệp / thư mục bị loại trừ tương đối với thư mục gốc của bạn (Tôi đã thử đường dẫn đầy đủ ở đây so với / nhưng tôi không thể làm cho nó hoạt động được).

hy vọng điều này sẽ giúp được ai đó (và tôi lần sau tôi google nó)


6
Câu trả lời này chắc chắn đã giúp tôi! Gotcha đối với tôi là lệnh của tôi trông giống như thế tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', và điều này không loại trừ bất cứ điều gì.
Anish Ramaswamy

2
Mẫu của bạn rất giống với những gì tôi đã gặp vấn đề! Cảm ơn bạn!
Qorbani

2
Đẹp và rõ ràng cảm ơn bạn. Đối với tôi vấn đề là các câu trả lời khác bao gồm tuyệt đối các đường dẫn tương đối. Nhưng tất cả những gì bạn phải làm là thêm tên của thư mục bạn muốn loại trừ.
Hubert

2
Đây là một câu trả lời rõ ràng hơn nhiều. Bởi vì ví dụ tôi đã có thể làm cho nó hoạt động như các đường dẫn lúc đầu khó hiểu. Cảm ơn nhiều!
fagiani

2
nó đã làm việc! Xin nhớ đừng thêm dấu gạch chéo vào loại trừ. Ví dụ: trong khi "file3" hoặc "file3 / thư mục con" hoạt động, "file3 /" và "file3 / thư mục con /" thì không!
lucaferrario

24

Bạn có thể sử dụng "ký hiệu kiến" tiêu chuẩn để loại trừ các thư mục tương đối.
Điều này làm việc cho tôi và loại trừ mọi thư mục .git hoặc node_module:

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

myInputFile.txt chứa:

/ dev2 / java
/ dev2 / javascript


4
Tôi tin rằng điều này đòi hỏi biến tùy chọn shell Bash globstarphải được kích hoạt. Kiểm tra với shopt -s globstar. Tôi nghĩ nó tắt theo mặc định trên hầu hết các hệ điều hành dựa trên unix. Từ hướng dẫn Bash: " continstar: Nếu được đặt, mẫu **được sử dụng trong ngữ cảnh mở rộng tên tệp sẽ khớp với tất cả các tệp và không hoặc nhiều thư mục và thư mục con. Nếu mẫu được theo sau bởi '/', chỉ các thư mục và thư mục con khớp với nhau. "
not2qubit

15

Tôi đã trải nghiệm điều đó, ít nhất là với phiên bản Cygwin của tar tôi đang sử dụng ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" trên Windows XP Home Edition Máy SP3), thứ tự các tùy chọn là quan trọng.

Trong khi việc xây dựng này làm việc cho tôi:

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

cái đó không hoạt động:

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

Điều này, trong khi tar --helptiết lộ những điều sau đây:

tar [OPTION...] [FILE]

Vì vậy, lệnh thứ hai cũng sẽ hoạt động, nhưng dường như nó không phải là trường hợp ...

Rgds tốt nhất,


5
Chỉ muốn thêm vào ở trên, điều quan trọng là thư mục cần loại trừ KHÔNG được chứa dấu gạch chéo ngược cuối cùng. Vì vậy, --exclude = '/ path / to / Elim / dir'ĐÚNG , --exclude = '/ path / to / Elim / dir /'SAI .
GeertVc

17
điều này là do kho lưu trữ đích target.tgz là một đối số của chuyển đổi f, mà nó nên tuân theo
Valentino ngày

14

Mẫu loại trừ này xử lý hậu tố tên tệp như png hoặc mp3 cũng như các tên thư mục như .git và node_modules

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

cảm ơn - đó là những gì tôi đang tìm kiếm :)
Alexander Br.

11

Đối với những người có vấn đề với nó, một số phiên bản tar sẽ chỉ hoạt động bình thường mà không có './' trong giá trị loại trừ.

Tar --version

tar (GNU tar) 1.27.1

Cú pháp lệnh hoạt động:

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

Những thứ này sẽ không hoạt động:

$ 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

Tôi đã tìm thấy điều này ở một nơi khác vì vậy tôi sẽ không lấy tín dụng, nhưng nó hoạt động tốt hơn bất kỳ giải pháp nào ở trên cho các vấn đề cụ thể về mac của tôi (mặc dù điều này đã bị đóng):

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

2
Cảm ơn câu trả lời này, tar trên darwin chắc chắn có một cú pháp khác và nó đã khiến tôi phát điên vì sao "--exclude = blah" trong các câu trả lời khác không hoạt động. Điều này làm việc tuyệt vời trên mac.
Michael

1
Đừng quên COPYFILE_DISABLE=1khi sử dụng tar, nếu không bạn có thể nhận được các tệp ._ trong tarball của mình
Benoit Duffez

Cảm ơn đã bao gồm câu trả lời của bạn. Thật tuyệt khi bao gồm một liên kết đến nguồn nơi bạn tìm thấy câu trả lời. Phần thưởng: nếu nguồn là từ một bài viết stackoverflow hoặc stackexchange khác, bạn sẽ nhận được thêm nghiệp (điểm hoặc huy hiệu - Tôi không nhớ cái nào). Dù bằng cách nào, họ đều có được nụ cười và mọi người đều chiến thắng. Không có nhược điểm :-) Nó cũng giúp mọi người nếu muốn tìm kiếm thêm thông tin. Đôi khi mọi người sẽ nâng cấp chỉ vì bạn đã bao gồm một liên kết nguồn. Cuối cùng, chia sẻ vấn đề cụ thể mà giải quyết này, hoặc tại sao đây là một giải pháp tốt hơn, nó có thể giúp người khác với một vấn đề duy nhất.
SherylHohman

8

Đối với Mac OSX tôi phải làm

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

Lưu ý -fsau--exclude=


6

Tôi đồng ý cờ --exclude là cách tiếp cận đúng.

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

Một lời cảnh báo về tác dụng phụ mà tôi không thấy rõ ràng ngay lập tức: Việc loại trừ 'fileA' trong ví dụ này sẽ tìm kiếm 'fileA' RECURSIVELY !

Ví dụ: Một thư mục có một thư mục con chứa một tệp cùng tên (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Nếu sử dụng --exclude='data.txt'các kho lưu trữ sẽ không chứa data.txt tập tin. Điều này có thể gây ra kết quả không mong muốn nếu lưu trữ thư viện của bên thứ ba, chẳng hạn như thư mục node_modules.

  • Để tránh vấn đề này, hãy đảm bảo cung cấp cho toàn bộ đường dẫn, như --exclude='./dirA/data.txt'


5

Để tránh các 'xargs: Argument list too long'lỗi có thể xảy ra do việc sử dụng find ... | xargs ...khi xử lý hàng chục nghìn tệp, bạn có thể chuyển đầu ra findtrực tiếp sang tarsử dụng find ... -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 -

bạn có thể trích dẫn chuỗi 'loại trừ', như thế này: 'somedir / filesdir / *' thì shell sẽ không mở rộng dấu hoa thị và các ký tự trắng khác.
Znik

xargs -n 1là một tùy chọn khác để tránh xargs: Argument list too longlỗi;)
Tuxdude

5

Sau khi đọc chủ đề này, tôi đã thực hiện một thử nghiệm nhỏ trên RHEL 5 và đây là kết quả của tôi để trích xuất thư mục abc:

Điều này sẽ loại trừ lỗi thư mục và nhật ký và tất cả các tệp trong thư mục:

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

Thêm ký tự đại diện sau thư mục bị loại trừ sẽ loại trừ các tệp nhưng giữ nguyên các thư mục:

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

Trong ví dụ thứ hai ở trên, nên có dấu hoa thị sau dấu gạch chéo cuối cùng trong mỗi mệnh đề loại trừ, nhưng bài đăng không lấy chúng.
Mike

4

Sử dụng lệnh find kết hợp với tùy chọn tar append (-r). Bằng cách này, bạn có thể thêm tệp vào tar hiện có trong một bước duy nhất, thay vì giải pháp hai lượt (tạo danh sách tệp, tạo tar).

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

4

Bạn cũng có thể sử dụng một trong các tùy chọn "--exclude-tag" tùy theo nhu cầu của bạn:

  • --exclude-tag = TẬP_TIN
  • --exclude-tag-all = TẬP_TIN
  • --exclude-tag-under = TẬP_TIN

Thư mục lưu trữ TẬP TIN đã chỉ định sẽ bị loại trừ.


4

Sau khi đọc tất cả các câu trả lời tốt này cho các phiên bản khác nhau và tự mình giải quyết vấn đề, tôi nghĩ rằng có những chi tiết rất nhỏ rất quan trọng và hiếm khi sử dụng chung GNU / Linux , không đủ nhấn mạnh và đáng được nhận xét hơn.

Vì vậy, tôi sẽ không cố gắng trả lời câu hỏi cho mọi trường hợp, nhưng thay vào đó, hãy cố gắng đăng ký nơi để tìm khi mọi thứ không hoạt động.

NÓ RẤT QUAN TRỌNG ĐẾN THÔNG BÁO:

  1. TRÌNH TỰ CỦA VẬT LIỆU TÙY CHỌN: không giống như đặt --exclude trước hơn sau tùy chọn tệp và thư mục để sao lưu. Điều này ít nhất là bất ngờ đối với tôi, bởi vì theo kinh nghiệm của tôi, trong các lệnh GNU / Linux, thường thì thứ tự của các tùy chọn không thành vấn đề.
  2. Các phiên bản tar khác nhau mong đợi các tùy chọn này theo thứ tự khác nhau: ví dụ: câu trả lời của @ Andrew chỉ ra rằng trong GNU tar v 1.26 và 1.28, các loại trừ xuất hiện sau cùng, trong trường hợp của tôi, với GNU tar 1.29, thì lại là cách khác.
  3. VẤN ĐỀ TRAO ĐỔI : ít nhất là trong GNU tar 1.29, nó không nên là bất kỳ .

Trong trường hợp của tôi, đối với GNU tar 1.29 trên Debian, lệnh đã hoạt động là

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

Các trích dẫn không quan trọng, nó làm việc có hoặc không có chúng.

Tôi hy vọng điều này sẽ hữu ích cho ai đó.


Cảm ơn bạn vì câu trả lời. Tôi đang tìm kiếm (một cảm giác như rất lâu) cho một giải pháp, và câu trả lời của bạn đã hướng dẫn tôi đi đúng hướng. Tuy nhiên, trong trường hợp của tôi (Ubuntu 18.04.3, Tar 1.29) tôi chỉ có thể làm cho nó hoạt động với việc thêm tên thư mục và KHÔNG phải đường dẫn, ví dụ: tar --exclude = thư mục1 --exclude = thư mục2 -czvf / opt / archify. thư mục tgz
Nitai

2

Bạn có thể sử dụng cpio (1) để tạo tập tin tar. cpio lấy các tệp để lưu trữ trên stdin, vì vậy nếu bạn đã tìm ra lệnh find bạn muốn sử dụng để chọn các tệp lưu trữ, hãy chuyển nó thành cpio để tạo tệp tar:

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

2

gnu tar v 1.26, --exclude cần xuất hiện sau tệp lưu trữ và các đối số thư mục sao lưu, không được có dấu gạch đầu dòng hoặc dấu và không thích dấu ngoặc kép (đơn hoặc kép). Vì vậy, liên quan đến thư mục PARENT được sao lưu, đó là:

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


Sau nhiều thử nghiệm, tôi đã tìm thấy ít nhiều điều tương tự với lệnh của tôi tar (GNU tar) 1.28.
PicoutputCls

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

-X chỉ ra một tệp chứa danh sách tên tệp phải được loại trừ khỏi bản sao lưu. Đối với trường hợp, bạn có thể chỉ định * ~ trong tệp này để không bao gồm bất kỳ tên tệp nào kết thúc bằng ~ trong bản sao lưu.


Tôi nghĩ rằng, đây là giải pháp tốt nhất, vì nó thậm chí còn hoạt động trong những trường hợp đó, rằng số lượng loại trừ là lớn. Cũng có thể bao gồm tùy chọn X trong gói tùy chọn, vì vậy hình thức ngắn nhất có lẽ là:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke

0

Đặt cược tốt nhất của bạn là sử dụng find với tar, thông qua xargs (để xử lý số lượng lớn đối số). Ví dụ:

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

4
Điều đó có thể khiến tar được gọi nhiều lần - và cũng sẽ đóng gói các tệp nhiều lần. Đúng là:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen

Tôi đã đọc ở đâu đó rằng khi sử dụng xargs, người ta nên sử dụng rtùy chọn tar thay cvì vì khi findthực sự tìm thấy vô số kết quả, các xargs sẽ chia các kết quả đó (dựa trên giới hạn đối số dòng lệnh cục bộ) thành chuncks và gọi tar trên mỗi phần. Điều này sẽ dẫn đến một kho lưu trữ chứa chunck cuối cùng được trả về bởixargs và không phải tất cả các kết quả được tìm thấy bởi findlệnh.
Stphane

0

Câu trả lời dư thừa có thể có nhưng vì tôi thấy nó hữu ích, nên đây là:

Trong khi một gốc FreeBSD (tức là sử dụng csh), tôi muốn sao chép toàn bộ hệ thống tập tin gốc của mình sang / mnt nhưng không có / usr và (rõ ràng) / mnt. Đây là những gì đã làm việc (Tôi đang ở /):

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

Toàn bộ quan điểm của tôi là nó là cần thiết (bằng cách đặt ./ ) để chỉ định tar cho các thư mục bị loại trừ trong đó một phần của thư mục lớn hơn được sao chép.

0,02 € của tôi


0

Tôi không có may mắn nhận được tar để loại trừ một thư mục con 5 Gigabyte sâu một vài cấp. Cuối cùng, tôi chỉ sử dụng lệnh unix Zip. Nó làm việc dễ dàng hơn nhiều đối với tôi.

Vì vậy, đối với ví dụ cụ thể này từ bài viết gốc
(tar --exclude = '. / Thư mục' --exclude = '. / Upload / thư mục2' -zcvf /backup/filename.tgz.)

Tương đương sẽ là:

zip -r /backup/filename.zip. -x tải lên / thư mục / ** \ * tải lên / thư mục2 / ** \ *

(Chú ý: Đây là bài tôi ban đầu được sử dụng mà đã giúp tôi /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )


3
Coi chừng: zipkhông đóng gói các thư mục trống, nhưng tarkhông!
t0r0X

0

Kiểm tra nó

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName

0

Tôi muốn có phiên bản front-end mới (thư mục góc) trên localhost. Ngoài ra, thư mục git rất lớn trong trường hợp của tôi và tôi muốn loại trừ nó. Tôi cần tải xuống từ máy chủ và giải nén nó để chạy ứng dụng.

Nén thư mục góc từ / var / lib / tomcat7 / webapps, di chuyển nó đến thư mục / tmp với tên angular.23.12.19.tar.gz

Chỉ huy :

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

0

Trường hợp thành công: 1) nếu đưa ra đường dẫn đầy đủ để sao lưu, loại trừ cũng nên sử dụng đường dẫn đầy đủ.

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

2) nếu đưa ra đường dẫn hiện tại để sao lưu, loại trừ cũng chỉ nên sử dụng đường dẫn hiện tại.

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

Trường hợp thất bại:

  1. Nếu đưa thư mục currentpath để sao lưu và đường dẫn đầy đủ để bỏ qua, thì sẽ không hoạt động

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

Lưu ý: đề cập loại trừ trước / sau thư mục sao lưu là tốt.


0

Nếu bạn đang cố gắng loại trừ các tệp Hệ thống kiểm soát phiên bản (VCS), tar đã hỗ trợ hai tùy chọn thú vị về nó! :)

  1. Tùy chọn: --exclude-vcs

Tùy chọn này không bao gồm các file và thư mục sử dụng bằng cách làm theo các hệ thống kiểm soát phiên bản: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, và Darcs.

Kể từ phiên bản 1.32, các tệp sau được loại trừ:

  • CVS/và mọi thứ bên dưới nó
  • RCS/và mọi thứ bên dưới nó
  • SCCS/và mọi thứ bên dưới nó
  • .git/và mọi thứ bên dưới nó
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/và mọi thứ bên dưới nó
  • .arch-ids/và mọi thứ bên dưới nó
  • {arch}/và mọi thứ bên dưới nó
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. Tùy chọn: --exclude-vcs-bỏ qua

Khi lưu trữ thư mục đang được một số hệ thống kiểm soát phiên bản (VCS), nó thường là thuận tiện để đọc mẫu loại trừ khỏi VCS này' bỏ qua các file (ví dụ .cvsignore, .gitignorevv) Tùy chọn này cung cấp khả năng như vậy.

Trước khi lưu trữ một thư mục, xem nếu nó chứa bất kỳ tập tin sau: cvsignore, .gitignore, .bzrignore, hoặc .hgignore. Nếu vậy, đọc bỏ qua các mẫu từ các tập tin này.

Các mẫu được xử lý nhiều như VCS tương ứng sẽ xử lý chúng, nghĩa là:

.cvsignore

Chứa các mẫu hình cầu kiểu vỏ sò chỉ áp dụng cho thư mục chứa tệp này. Không có ý kiến ​​được cho phép trong các tập tin. Các dòng trống được bỏ qua.

.gitignore

Chứa các mẫu hình cầu vỏ. Áp dụng cho thư mục .gitfilenằm ở đâu và tất cả các thư mục con của nó.

Bất kỳ dòng bắt đầu với một #là một nhận xét. Dấu gạch chéo ngược thoát khỏi ký tự nhận xét.

.bzrignore

Chứa các mẫu hình cầu vỏ và các biểu thức chính quy (nếu có tiền tố là RE:(16). Các mẫu ảnh hưởng đến thư mục và tất cả các thư mục con của nó.

Bất kỳ dòng bắt đầu với một #là một nhận xét.

.hgignore

Chứa các biểu thức chính quy (17). Các dòng syntax: globchuyển sang mô hình vỏ toàn cầu. Dòng syntax: regexpchuyển trở lại. Nhận xét bắt đầu bằng a #. Các mẫu ảnh hưởng đến thư mục và tất cả các thư mục con của nó.

  1. Thí dụ

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


-1

Các kịch bản bash sau đây nên làm thủ thuật. Nó sử dụng câu trả lời được đưa ra ở đây bởi Marcus 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

Điều này sẽ in ra lệnh bạn cần và bạn chỉ có thể sao chép và dán lại. Có lẽ có một cách thanh lịch hơn để cung cấp trực tiếp cho dòng lệnh.

Chỉ cần thay đổi * .CC cho bất kỳ tiện ích mở rộng, tên tệp hoặc biểu thức chính quy nào bạn muốn loại trừ và điều này vẫn hoạt động.

BIÊN TẬP

Chỉ cần thêm một chút giải thích; find tạo ra một danh sách các tệp khớp với regex đã chọn (trong trường hợp này là * .CC). Danh sách này được truyền qua xargs cho lệnh echo. Bản in này - bao gồm 'một mục trong danh sách'. Dấu gạch chéo () là ký tự thoát cho dấu '.


1
Yêu cầu đầu vào tương tác là một lựa chọn thiết kế kém cho hầu hết các tập lệnh shell. Thay vào đó, hãy đọc thông số dòng lệnh và bạn sẽ nhận được lợi ích của việc hoàn thành tab của shell, hoàn thành lịch sử, chỉnh sửa lịch sử, v.v.
tripleee

1
Ngoài ra, tập lệnh của bạn không hoạt động đối với các đường dẫn chứa siêu ký tự khoảng trắng hoặc vỏ. Về cơ bản, bạn nên luôn luôn đặt các biến trong dấu ngoặc kép trừ khi bạn đặc biệt yêu cầu trình bao để thực hiện mã thông báo khoảng trắng và mở rộng ký tự đại diện. Để biết chi tiết, vui lòng xem stackoverflow.com/questions/10067266/ từ
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.