Giải nén nhiều file zip một lúc trên Ubuntu
Wednesday, December 3, 2008
Để giải nén file zip trên Ubuntu, chúng ta có sẵn công cụ unzip, cú pháp giải nén 1 file sẽ là:
Một cách tự nhiên, chúng ta sẽ thử giải nén nhiều file zip trong thư mục hiện thời với câu lệnh:
Tuy nhiên những gì nhận được sẽ là 1 thông báo lỗi:
Nguyên nhân là do câu lệnh trên sẽ được diễn giải thành:
và được Ubuntu hiểu là giải nén file2.zip và file3.zip nằm trong file1.zip. Và nếu trong file1.zip không có chứa file2.zip hay file3.zip (mà thường là thế) thì sẽ nhận được thông báo lỗi trên.
Để khắc phục nhược điểm trên, có 2 cách thường được dùng: một là làm cho Ubuntu hiểu đúng ý nghĩa của dấu * như chúng ta mong muốn và hai là liệt kê các file zip trong thư mục hiện thời rồi giải nén chúng.
Phương pháp thứ 2 là cách tiếp cận khá trực tiếp và dễ hiểu. Chúng ta sẽ xem xét phương pháp này trước.
Để liệt kê các file trong thư mục hiện thời, chúng ta có thể dùng lệnh dir, ls hay dùng vòng lặp for. Do đó ta có 1 số cách làm sau đây:
hoặc
Có thể nhận thấy là nếu dùng vòng lặp for thì không cần phải chuyển đầu vào cho lệnh khác, còn nếu dùng ls hay dir thì cần có lệnh xargs để chuyển kết quả đó thành tham số cho lệnh unzip phía sau, tham số -n1 ám để chỉ lệnh unzip nhận 1 tham số.
Phương pháp làm cho Ubuntu hiểu đúng ý nghĩa của dấu * có thể thực hiện được bằng cách bắt Ubuntu hiểu đó không phải là kí tự wild card khi thực thi. Để làm điều này, có 2 mẹo nhỏ đó là dùng dấu nháy đơn (') hoặc kép (") và dùng kí tự xổ ngược \. Do đó ta có các lệnh tương ứng sau:
hoặc
Ở đây cần hiểu là dấu * không được dịch thành tên các file khi bắt đầu chạy lệnh theo cách mà bash làm bình thường (tức là dịch thành unzip file1.zip file2.zip file3.zip) mà được dịch thành tên file trong mỗi lần chạy unzip (tức là dịch thành unzip file1.zip; unzip file2.zip; unzip file3.zip).
Một số link các bạn có thể tham khảo thêm:
Cyberciti: How do I unzip multiple / many files under Linux?
Ubuntu Forum: How do I unzip multiple files at once?
unzip filename.zip
Một cách tự nhiên, chúng ta sẽ thử giải nén nhiều file zip trong thư mục hiện thời với câu lệnh:
unzip *.zip
Tuy nhiên những gì nhận được sẽ là 1 thông báo lỗi:
caution: filename not matched
Nguyên nhân là do câu lệnh trên sẽ được diễn giải thành:
unzip file1.zip file2.zip file3.zip
và được Ubuntu hiểu là giải nén file2.zip và file3.zip nằm trong file1.zip. Và nếu trong file1.zip không có chứa file2.zip hay file3.zip (mà thường là thế) thì sẽ nhận được thông báo lỗi trên.
Để khắc phục nhược điểm trên, có 2 cách thường được dùng: một là làm cho Ubuntu hiểu đúng ý nghĩa của dấu * như chúng ta mong muốn và hai là liệt kê các file zip trong thư mục hiện thời rồi giải nén chúng.
Phương pháp thứ 2 là cách tiếp cận khá trực tiếp và dễ hiểu. Chúng ta sẽ xem xét phương pháp này trước.
Để liệt kê các file trong thư mục hiện thời, chúng ta có thể dùng lệnh dir, ls hay dùng vòng lặp for. Do đó ta có 1 số cách làm sau đây:
ls *.zip | xargs -n1 unzip
hoặc
for z in *.zip; do unzip $z; done
Có thể nhận thấy là nếu dùng vòng lặp for thì không cần phải chuyển đầu vào cho lệnh khác, còn nếu dùng ls hay dir thì cần có lệnh xargs để chuyển kết quả đó thành tham số cho lệnh unzip phía sau, tham số -n1 ám để chỉ lệnh unzip nhận 1 tham số.
Phương pháp làm cho Ubuntu hiểu đúng ý nghĩa của dấu * có thể thực hiện được bằng cách bắt Ubuntu hiểu đó không phải là kí tự wild card khi thực thi. Để làm điều này, có 2 mẹo nhỏ đó là dùng dấu nháy đơn (') hoặc kép (") và dùng kí tự xổ ngược \. Do đó ta có các lệnh tương ứng sau:
unzip '*.zip'
hoặc
unzip \*.zip
Ở đây cần hiểu là dấu * không được dịch thành tên các file khi bắt đầu chạy lệnh theo cách mà bash làm bình thường (tức là dịch thành unzip file1.zip file2.zip file3.zip) mà được dịch thành tên file trong mỗi lần chạy unzip (tức là dịch thành unzip file1.zip; unzip file2.zip; unzip file3.zip).
Một số link các bạn có thể tham khảo thêm:
Cyberciti: How do I unzip multiple / many files under Linux?
Ubuntu Forum: How do I unzip multiple files at once?
Bài liên quan
Home