2013-09-11 27 views
40

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ụngLà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?

tar -cf my_archive *

nó hắc ín tất cả các file, 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 thế nào tôi có thể làm cho nó tar đệ quy nhưng chỉ bao gồm hai loại tập tin?

Trả lời

76

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

+3

AFAIK không có lý do gì để làm lộn xộn tìm thấy với các dấu thoát, nó hoạt động mà không cần ... –

+0

@koodawg Cảm ơn bạn đã gợi ý! Trên hệ điều hành tôi đã thử nghiệm (CentOS 6.4), lệnh không hoạt động mà không thoát khỏi dấu ngoặc đơn. – DeeDee

+0

@DeeDee Có bất kỳ hạn chế nào về số lượng tệp, v.v. không? – user1566515

6

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

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

Có một số hãy cẩn thận với phương pháp này tuy nhiên:

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

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

+0

1) Bằng" thất bại ", bạn có nghĩa là các tệp có dấu cách sẽ bị bỏ qua hay kho lưu trữ tar sẽ không được tạo? 2) Tôi có khoảng 100K tệp. Đó có phải là chiều dài dòng lệnh tối đa không? – user1566515

+1

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

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

Sử dụng "tìm" và "grep" để nhận tất cả đường dẫn tệp .php và .html trong tất cả thư mục và thư mục con của nó. Sau đó, chuyển các thông tin đường dẫn đó tới tar để nén.

Hãy cẩn thận với những biểu tượng đó 'và'. Cũng lưu ý rằng điều này sẽ đạt đến giới hạn số lượng ký tự mà shell 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.

0

này sẽ xử lý đường dẫn với không gian:

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

Để nén nhiều file với các mẫu khác nhau, chúng ta có thể tách chúng với không gian và thêm chúng vào tất cả các tập tin gz, như thế này:

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.

+0

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

+0

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

+0

@Eddie ** sẽ hoạt động. có thể có điều gì đó khác với 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 vượt qua trong dòng lệnh hay không. Nếu không, bạn có thể dán lệnh thực tế của mình không? –

Các vấn đề liên quan