2012-04-28 42 views
17

Tôi muốn lặp lại giữa các thư mục con của vị trí hiện tại và gzip từng tệp riêng biệt. Để nén các tệp trong một thư mục, tôi sử dụngCách gzip tất cả các tệp trong tất cả các thư mục con trong bash

for file in *; do gzip "$file"; done 

nhưng điều này chỉ có thể hoạt động trên thư mục hiện tại chứ không phải thư mục con của thư mục hiện tại. Làm thế nào tôi có thể viết lại các câu lệnh trên để nó cũng nén các tệp trong tất cả các thư mục con?

Trả lời

41

Không cần vòng lặp hoặc bất cứ điều gì hơn findgzip:

find . -type f ! -name '*.gz' -exec gzip "{}" \; 

này tìm tất cả các file thường xuyên trong và bên dưới thư mục hiện hành có tên không kết thúc với phần mở rộng .gz (có nghĩa là , tất cả các tệp chưa được nén). Nó gọi gzip trên mỗi tệp riêng lẻ.


Chỉnh sửa, dựa trên bình luận từ user unknown:

Các dấu ngoặc nhọn ({}) được thay thế bằng tên tập tin, mà được truyền trực tiếp, như một từ duy nhất, để lệnh sau -exec như bạn có thể nhìn thấy tại đây:

$ touch foo 
$ touch "bar baz" 
$ touch xyzzy 
$ find . -exec echo {} \; 

./foo 
./bar baz 
./xyzzy 
+2

Câu cuối cùng của bạn là thông tin sai lạc phổ biến. Tìm hiểu nơi một tên tập tin bắt đầu và nơi nó kết thúc. Bản thân nó, nó không có bất kỳ vấn đề với khoảng trống hoặc linebreaks và những điều funny khác. Vì vậy, '-exec gzip {}' gọi gzip với một tên tệp duy nhất, và vì không có trình bao trung gian nào được gọi, có thể giải thích một dấu trống làm dấu phân tách, gzip sẽ nhận được toàn bộ tên tệp. Gợi ý trong manpage của find dường như đã lỗi thời và có nghĩa là: shell của bạn có thể cố gắng diễn giải {} trước khi truyền nó đi tìm, nhưng không có shell nào được thấy [trong nhiều năm] (http://unix.stackexchange.com/q/) 8647/4485). –

+1

Bạn học điều gì đó mới mỗi ngày. Cảm ơn bài học! –

+2

+1 cho tệp * .gz loại trừ – GuruM

5
find . -type f | while read file; do gzip "$file"; done 
+1

nếu một tệp có chứa khoảng trắng hoặc ký tự đặc biệt khác thì sao? mà sẽ không làm việc với 'for' có – c00kiemon5ter

+1

@ c00kiemon5ter Có một câu trả lời có hiệu quả, nhưng có thể không hoàn toàn xứng đáng với một downvote? Theo SO "Sử dụng downvotes của bạn bất cứ khi nào bạn gặp phải một bài viết cẩu thả, không tốn công sức, hoặc một câu trả lời rõ ràng và có lẽ là không chính xác nguy hiểm." Câu trả lời này không phải là những thứ đó. Không đầy đủ, hơi cẩu thả, nhưng không chính xác. Bạn có lẽ nên để cho quá trình upvote mất số điện thoại của nó và để lại một bình luận. –

+0

imo, câu trả lời là sai. Farshid không bao giờ xác định rằng các tập tin không chứa các ký tự đặc biệt, do đó câu trả lời của bạn chỉ trả lời một trường hợp đặc biệt của câu hỏi. Bạn nên sử dụng 'find .. | trong khi đọc ..'. Sửa câu trả lời của bạn và tôi sẽ là người đầu tiên upvote. Nhưng đừng hỏi tôi để quảng bá câu trả lời sai (imo). – c00kiemon5ter

11

Tôi thích gzip -r ./ cũng giống như vậy nhưng ngắn hơn.

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