Câu trả lời:
Nếu bạn thực sự muốn giải nén chúng song song, bạn có thể làm
for i in *zip; do unzip "$i" & done
Tuy nhiên, điều đó sẽ khởi chạy N process cho các tệp N .zip và có thể rất nặng trên hệ thống của bạn. Để có cách tiếp cận được kiểm soát nhiều hơn, chỉ khởi chạy 10 quy trình song song cùng một lúc, hãy thử điều này:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Để kiểm soát số lượng quy trình song song được khởi chạy, hãy thay đổi -P
thành bất cứ điều gì bạn muốn. Nếu bạn không muốn tái diễn vào các thư mục con, thay vào đó, hãy làm điều này:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Ngoài ra, bạn có thể cài đặt song song GNU theo đề xuất của @OleTange trong các nhận xét và chạy
parallel unzip ::: *zip
-exec
hoặc -execdir
thay vì đường ống đến xargs
. Không chỉ đơn giản để hiểu, mà còn ít bị lỗi hơn và sử dụng ít tài nguyên hệ thống hơn. find . -name '*.zip' -exec unzip {} ';'
(Bạn phải trích dẫn dấu chấm phẩy.)
-exec \;
(bạn có thể thoát dấu chấm phẩy, không cần dấu ngoặc kép), sẽ chạy từng lệnh một cách tuần tự. -exec +
tốt hơn nhưng nó sẽ không hoạt động ở đây vì đó không phải là cách unzip
hoạt động.
Lệnh song song GNU rất phù hợp với loại điều này. Sau:
$ sudo apt-get install parallel
Sau đó
ls *.zip | parallel unzip
Điều này sẽ sử dụng nhiều lõi như bạn có, giữ cho mỗi lõi bận rộn với một giải nén, cho đến khi tất cả chúng được thực hiện.
echo *.zip
Thay vào đó, nên sử dụng một ý tưởng tốt hơn để ngăn bí danh ls có thể lén lút trong thông tin bổ sung. Tuy nhiên, điều này có cùng một vấn đề như câu trả lời của @ Guru, nó phá vỡ tên tệp chứa khoảng trắng.
xargs
GNU Parallel không phá vỡ tên tệp chứa dấu cách / tab / quote. Chỉ khi tên tệp chứa dòng mới, bạn sẽ phải chăm sóc thêm. Ví dụ: bằng cách sử dụng:parallel unzip ::: *.zip
echo
cũng tệ như sử dụng ls
. Globbing và một vòng lặp while là an toàn nhất.
Nếu bạn có nhiều .zip
tệp trong thư mục của mình và bạn muốn giải nén tất cả chúng thì hãy mở terminal và vào thư mục của bạn bằng cách sử dụng:
cd <path_to_folder>
Bây giờ sử dụng lệnh này để giải nén tất cả các .zip
tệp của bạn :
ls *.zip | xargs -n1 unzip
echo *.zip
Thay vào đó, nên sử dụng một ý tưởng tốt hơn để ngăn ls
bí danh có thể lén lút trong thông tin bổ sung, tuy nhiên điều đó vẫn không khắc phục được vấn đề khoảng trắng.
ls
cho các tập lệnh, vì đầu ra của nó không được xác định rõ giữa các phiên bản. Thay vào đó hãy nhìn vào câu trả lời từ @terdon vì nó giải quyết được tất cả các vấn đề của giải pháp này.
Bạn có thể sử dụng find với -exec
như vậy,
find . -name "*.zip" -exec unzip {} \;
Điều này sẽ hoạt động nếu tập tin có một khoảng trắng trong tên.
unzip \*.zip
hoặc là unzip '*.zip'
Rõ ràng là unzip *.zip
không hoạt động, vì shell mở rộng nó unzip foo.zip bar.zip ...
và unzip
giải thích tên tệp đầu tiên là tệp zip và tên tệp sau dưới dạng tệp để trích xuất từ tệp zip đó.
Tuy nhiên, unzip
có một chút khác thường giữa các lệnh Unix ở chỗ nó thực hiện mở rộng toàn cầu. Nếu *
shell không được mở rộng, giải nén sẽ thực hiện điều đó và đặt lại tất cả các tên tệp kết quả dưới dạng tệp zip cần xử lý. Vì vậy, trong trường hợp đặc biệt này, người ta có thể thoát khỏi mà không cần một for
vòng lặp hoặc xargs
tương tự.