Phương pháp số 1 - Sử dụng đầu & đuôi
Bạn có thể sử dụng lệnh head
để lấy ra 40 tệp đầu tiên từ danh sách tệp như vậy:
$ head -40 input_files | xargs ...
Để có được 40 tiếp theo:
$ tail -n +41 input_file | head -40 | xargs ...
...
$ tail -n +161 input_file | head -40 | xargs ...
Bạn có thể tiếp tục đi xuống danh sách, 40 cùng một lúc bằng cách sử dụng kỹ thuật này.
Phương pháp # 2 - Sử dụng xargs
Nếu bạn tình cờ có tất cả tên tệp của mình trong một biến, bạn có thể sử dụng xargs
như vậy để chia danh sách thành các phần của số phần tử X.
Thí dụ
Giả vờ các tập tin của tôi được gọi là 1-200. Vì vậy, tôi tải chúng lên thành một biến như vậy:
$ files=$(seq 200)
Bạn có thể thấy một vài mục đầu tiên trong biến này:
$ echo $files | head -c 20
1 2 3 4 5 6 7 8 9 10
Bây giờ chúng tôi sử dụng xargs
để chia nó ra:
$ xargs -n 40 <<<$files
1 2 3 4 5 6 7 8 9 10 ...
41 42 43 44 45 46 47 ...
81 82 83 84 85 86 87 ...
121 122 123 124 125 ...
141 142 143 144 145 ...
161 162 163 164 165 ...
181 182 183 184 185 ...
Sau đó, bạn có thể truyền lệnh trên cho lệnh khác xargs
để chạy chương trình của bạn:
$ xargs -n 40 <<<$files | xargs ...
Nếu nội dung của danh sách các tệp không dễ truy cập từ một biến, bạn có thể đưa ra xargs
danh sách qua tệp thay thế:
$ xargs -n 40 <input_file
1 2 3 4 5 6 7 8 9 10 ...
41 42 43 44 45 46 47 ...
81 82 83 84 85 86 87 ...
121 122 123 124 125 ...
141 142 143 144 145 ...
161 162 163 164 165 ...
181 182 183 184 185 ...
Phương pháp # 3 - mảng Bash
Giả sử bạn có tên tệp của mình trong một mảng Bash. Một lần nữa tôi đang sử dụng một chuỗi số 1-200 để thể hiện tên tệp của mình.
$ foo=( $(seq 200) )
Bạn có thể thấy nội dung của mảng như vậy:
$ echo ${foo[@]}
1 2 3 4 5 ....
Bây giờ để có được 40 đầu tiên:
$ echo "${foo[@]:0:40}"
40 thứ 2, v.v .:
$ echo "${foo[@]:40:40}"
...
$ echo "${foo[@]:160:40}"