find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
Bạn có thể dễ dàng chuyển nó xung quanh để bao gồm những gì bạn muốn nén ( -name '*.txt -or -name '*.html
v.v.) thay vì như bây giờ, ngoại trừ một số tệp (đã được nén, sao lưu và các tệp tạm thời).
Xử lý không gian trong tên tệp cũng tốt.
Thay đổi gzip
để echo gzip
thử nghiệm. Hoặc bỏ qua phần -exec tất cả cùng nhau.
Chỉnh sửa: Ồ, tôi quên đề cập rằng điều này không kiểm tra nếu <target>.gz
đã tồn tại. Điều này có thể hoặc không thể là một vấn đề.
Edit2: Ok, ở đây chúng tôi đi với một cái gì đó kiểm tra tệp hiện có. Nếu điều đó có thể được muốn. Xin tha thứ cho oneliney.
while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz"; fi done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))
My find
-foo có lẽ không phải là những gì nó có thể, rất có thể có thể bỏ qua trực tiếp trong tìm kiếm.
*.*
trongls
?