Đặt tất cả tên tệp vào một mảng có tên "files" trong bash:
files=( * )
kích thước của mảng:
echo ${#files[@]}
xác định 2/3 trong số chúng là cỡ mẫu:
take=$((2*${#files[@]}/3))
for i in $(seq 1 $take)
do
r=$((RANDOM%${#files[@]}))
echo ${files[r]}
done
Điều này sẽ chọn bản sao, và đang không thử nghiệm với tên tập tin bằng các đoạn trống và như vậy.
Cách đơn giản nhất để tránh trùng lặp là lặp lại tất cả các tệp và chọn từng tệp có 2/3 cơ hội, nhưng điều này không nhất thiết sẽ dẫn đến 200 tệp.
Điều này sẽ xóa một tệp nếu nó được chọn từ danh sách và đáp ứng các yêu cầu của bạn:
#!/bin/bash
files=( * )
# define 2/3 of them as sample size:
take=$((2*${#files[@]}/3))
while (( i < $take ))
do
r=$((RANDOM%${#files[@]}))
f=${files[r]}
if [[ -n $f ]]
then
i=$((i+1))
echo ${files[r]}
unset files[r]
fi
done
list.files()
...