Câu trả lời:
Kịch bản nhỏ này dường như là lựa chọn tốt nhất của bạn, đưa ra các yêu cầu của bạn:
cd directory
for dir in */
do
base=$(basename "$dir")
tar -czf "${base}.tar.gz" "$dir"
done
Nó xử lý đúng các thư mục có khoảng trắng trong tên của chúng.
Còn cái này thì sao: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;
Giải thích: Bạn chạy tìm trên tất cả các mục trong thư mục hiện tại. Maxdepth 0 làm cho nó không lặp lại bất kỳ giá trị nào thấp hơn các đối số đã cho. (Trong trường hợp này * hoặc tất cả các mục trong thư mục hiện tại của bạn) Đối số 'd' với "-type" chỉ khớp với các thư mục. Sau đó exec chạy tar trên bất cứ thứ gì phù hợp. ({} được thay thế bằng tệp phù hợp)
for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
Điều này sẽ tạo một tệp có tên blah.tar.gz cho mỗi tệp trong thư mục có tên là blah.
$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done
Nếu bạn có nhiều hơn các thư mục đơn giản trong thư mục (ví dụ như các tệp, vì ls sẽ trả về mọi thứ trong thư mục), thì hãy sử dụng:
$ cd directory
$ for dir in `find . -maxdepth 1 -type d | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done
Grep -v loại trừ thư mục hiện tại sẽ hiển thị trong find
lệnh theo mặc định.
for dir in *