Dưới đây là một vài cách bổ sung để làm những gì bạn đang tìm kiếm với các ghi chú về ưu và khuyết điểm.
Sau đây chỉ hoạt động với tên tệp không bao gồm dòng mới. Nó ghép nối các tập tin ở chế độ khóa. Nó sử dụng một bộ mô tả tập tin bổ sung để đọc từ danh sách đầu tiên. Nếu im1_dir
chứa nhiều tệp hơn, vòng lặp sẽ dừng khi im2_dir
hết. Nếu im2_dir
chứa nhiều tệp hơn, file1
sẽ trống cho tất cả các số chưa khớp file2
. Tất nhiên nếu chúng chứa cùng một số lượng tập tin, không có vấn đề gì.
#!/bin/bash
im1_dir=(~/prev1/*.png)
im2_dir=(~/prev3/*.png)
exec 3< <(printf '%s\n' "${im1_dir[@]}")
while IFS=$'\n' read -r -u 3 file1; read -r file2
do
run_black "$file1" "$file2"
done < <(printf '%s\n' "${im1_dir[@]}")
exec 3<&-
Bạn có thể thực hiện hành vi phù hợp để các vòng lặp dừng lại chỉ với file phù hợp không có sản phẩm nào không có vấn đề mà danh sách dài bằng cách thay thế các dấu chấm phẩy với một dấu và đôi như vậy:
while IFS=$'\n' read -r -u 3 file1 && read -r file2
này phiên bản sử dụng vòng lặp for
thay vì vòng lặp while
. Điều này dừng lại khi ngắn hơn của hai danh sách chạy ra ngoài.
#!/bin/bash
im1_dir=(~/prev1/*.png)
im2_dir=(~/prev3/*.png)
for ((i = 0; i < ${#im1_dir[@]} && i < ${#im2_dir[@]}; i++))
do
run_black "${im1_dir[i]}" "${im2_dir[i]}"
done
Phiên bản này tương tự như phiên bản ở trên, nhưng nếu một trong các danh sách chạy hết, hãy sử dụng lại các mục cho đến khi danh sách còn lại hết. Nó rất xấu và bạn có thể làm điều tương tự một cách đơn giản hơn.
#!/bin/bash
im1_dir=(~/prev1/*.png)
im2_dir=(~/prev3/*.png)
for ((i = 0, j = 0,
n1 = ${#im1_dir[@]},
n2 = ${#im2_dir[@]},
s = n1 >= n2 ? n1 : n2,
is = 0, js = 0;
is < s && js < s;
i++, is = i, i %= n1,
j++, js = j, j %= n2))
do
run_black "${im1_dir[i]}" "${im2_dir[i]}"
done
Phiên bản này chỉ sử dụng mảng cho vòng lặp bên trong (thư mục thứ hai). Nó sẽ chỉ thực thi nhiều lần vì có các tệp trong thư mục đầu tiên.
#!/bin/bash
im1_dir=~/prev1/*.png
im2_dir=(~/prev3/*.png)
for file1 in $im1_dir
do
run_black "$file1" "${im2_dir[i++]}"
done
Bạn đang tìm kiếm "sản phẩm Descartes"? Ví dụ: nếu thư mục 1 có tệp A B C và thư mục 2 có tệp b c, bạn đang tìm kiếm tệp đầu ra 9 (Aa, Ab, Ac, Ba, Bb, Bc, Ca, Cb, Cc) phải không? – jedwards
@jedwards: Tôi nghĩ OP muốn Aa Bb Cc hơn là một sản phẩm Descartes. –
@ DennisWilliamson: tôi cũng thế, nhưng nghĩ về nó quá nhiều khiến tôi không chắc chắn – jedwards