Làm thế nào để tar một số loại tệp nhất định trong tất cả các thư mục con?


83

Tôi muốn tar và tất cả các tệp .php và .html trong một thư mục và các thư mục con của nó. Nếu tôi sử dụng

tar -cf my_archive *

nó ghi tất cả các tệp mà tôi không muốn. Nếu tôi sử dụng

tar -cf my_archive *.php *.html

nó bỏ qua các thư mục con. Làm cách nào để tạo tệp tar đệ quy nhưng chỉ bao gồm hai loại tệp?

Câu trả lời:


143

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -


@DeeDee Có giới hạn nào về số lượng tệp, v.v. không?
dùng1566515

1
@DeeDee - không, ý tôi là bạn không cần parens!
Mike Makuch

@ user1566515 Có thể có một số giới hạn hệ thống tệp hoặc giới hạn dung lượng tổng thể sẽ đặt giới hạn trên cho tệp tar của bạn. Điều đó hoàn toàn phụ thuộc vào hệ thống của riêng bạn. Nếu không, đường ống về cơ bản sẽ tạo tệp tar một cách nhanh chóng, vì vậy bạn sẽ không bị giới hạn bởi số lượng hoặc kích thước tệp.
DeeDee

Cảm ơn! ... làm thế nào để thêm nhiều hơn 2 điều kiện / loại tệp?
gluuke

5
@gluuke sử dụng -o -name [pattern]cho mỗi điều kiện mới
DeeDee

15

Nếu bạn đang sử dụng bashphiên bản> 4.0, bạn có thể khai thác shopt -s globstarđể thực hiện ngắn gọn điều này:

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

điều này sẽ thêm tất cả các tệp .yml bắt đầu bằng Alice từ bất kỳ thư mục con nào và thêm tất cả các tệp .json bắt đầu bằng Bob từ bất kỳ thư mục con nào.


2
Câu trả lời duy nhất chỉ sử dụng tar, câu trả lời tốt nhất IMO.
simon

2
Mặc dù ấn tượng bởi glob '**' cho thư mục, lệnh này không thực hiện đệ quy (bất kỳ sub-sub-folder)
Eddie

@Eddie ** sẽ hoạt động. có thể có điều gì đó khác với các thông số của bạn. Ngoài ra, hãy kiểm tra xem có bất kỳ khoảng trống nào trong tên thư mục mà bạn chuyển vào dòng lệnh hay không. Nếu không, bạn có thể dán lệnh thực sự của mình không?
Sairam Krish

'**' được đánh giá bởi shell trước khi đến lệnh và nó chỉ được coi là 2 độc lập * phân giải thành 0 hoặc các ký tự, nó không có chức năng đệ quy để mở rộng các thư mục tldp.org/LDP/GNU-Linux-Tools-Summary/ html / x11655.htm
Eddie

2
@eddie có nó được đánh giá bởi vỏ, mặc dù bash> 4,0 có một shopt -s globstarlựa chọn, vì vậy câu trả lời là đúng và thực sự là tốt nhất
La Mã Usherenko

13

Một phương pháp là:

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

Tuy nhiên, có một số lưu ý với phương pháp này:

  1. Nó sẽ không thành công nếu có bất kỳ tệp hoặc thư mục nào có dấu cách trong đó và
  2. nó sẽ không thành công nếu có quá nhiều tệp mà độ dài dòng lệnh tối đa đã đầy.

Một giải pháp cho những điều này có thể là xuất nội dung của lệnh find vào một tệp, sau đó sử dụng tùy chọn "-T, --files-from FILE" để tar.


1) "Không thành công" có nghĩa là các tệp có khoảng trắng sẽ bị bỏ qua hoặc kho lưu trữ tar sẽ không được tạo? 2) Tôi có khoảng 100K tệp. Có vượt quá độ dài dòng lệnh tối đa không?
user1566515

1
1. Nó sẽ tạo kho lưu trữ, nhưng nó sẽ thông báo các tệp bị thiếu. 2. Điều đó sẽ là quá lâu, tôi mong đợi. Với điều này, tốt nhất bạn nên sử dụng một phương pháp như @DeeDee đề xuất bên dưới, nó sẽ giải quyết những vấn đề này khá tốt.
Robin Sheat,

3

Điều này sẽ xử lý các đường dẫn có dấu cách:

find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +

0

Đặt chúng vào một tệp

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

Sau đó, sử dụng tệp làm đầu vào cho tar, sử dụng -I hoặc -T tùy thuộc vào phiên bản tar bạn sử dụng

Sử dụng h để sao chép các liên kết tượng trưng

tar cfh my.tar -I files.txt 

0

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

cho đa lõi hoặc chỉ cho một lõi:

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz


-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

Sử dụng "find" và "grep" để lấy tất cả đường dẫn của tệp .php và .html trong tất cả thư mục và các thư mục con của nó. Sau đó chuyển các thông tin đường dẫn đó sang tar để nén.

Hãy cẩn thận với những ký hiệu `và '. Cũng lưu ý rằng điều này sẽ đạt đến giới hạn số lượng ký tự mà trình bao của bạn sẽ cho phép trên dòng lệnh, không giống như một số câu trả lời khác.

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.