규칙에 따라 이름이 지정된 파일 세트가 있습니다 file_[number]_[abcd].bin
. 여기서 [숫자]는 0에서 드라이브 크기(MB 단위)까지의 숫자입니다. 즉, file_0_a.bin
, file_0_b.bin
, file_0_c.bin
그리고 a 등이 file_0_d.bin
됩니다 .0
1
파일 수는 파티션 크기를 기준으로 런타임 시 계산됩니다. 생성된 모든 파일을 삭제해야 하지만 의사 무작위 방식으로 삭제해야 합니다.지정할 수 있어야 하는 크기의 덩어리로즉, 1024개의 파일이 있는 경우 512개를 삭제하고 512개를 더 삭제합니다.
현재 이 작업을 수행하기 위해 다음 함수가 있습니다. 필요한 만큼 여러 번 호출하지만 존재하고 완료되지 않을 수 있는 파일을 찾을 가능성이 점점 줄어듭니다. 분명히 이것은 이상적이지 않습니다.
모든 파일을 무작위로 삭제하려면 어떤 방법을 사용할 수 있나요?
deleteRandFile() #$1 - total number of files
{
i=$((RANDOM%$1))
j=$((RANDOM%3))
file=""
case $j in
0)
file="${dest_dir}/file_${i}_a.bin";;
1)
file="${dest_dir}/file_${i}_b.bin";;
2)
file="${dest_dir}/file_${i}_c.bin";;
3)
file="${dest_dir}/file_${i}_d.bin";;
esac
if ! [[ -f $file ]]; then
deleteRandFile $1
else
rm $file
fi
return 0;
}
편집: 파일을 최대한 분할할 수 있도록 무작위 순서로 삭제하려고 합니다. 이는 먼저 드라이브를 1MB 파일로 채운 다음 한 번에 1024개씩 삭제한 다음 1개의 1GB 파일로 "간격"을 채우는 스크립트의 일부입니다. 아주 조각난 1GB 파일이 나올 때까지 헹구고 반복하세요.
답변1
삭제하고 싶다면모두파일이 있으면 GNU 시스템에서 다음을 수행할 수 있습니다.
cd -P -- "$destdir" &&
printf '%s\0' * | # print the list of files as zero terminated records
sort -Rz | # random sort (shuffle) the zero terminated records
xargs -r0 rm -f # pass the input if non-empty (-r) understood as 0-terminated
# records (-0) as arguments to rm -f
정규식과 일치하는 특정 수의 항목만 제거하려면 sort
와 사이에 다음과 같은 내용을 삽입 할 수 있습니다 xargs
.
awk -v RS='\0' -v ORS='\0' -v n=1024 '/regexp/ {print; if (--n == 0) exit}'
이를 통해 zsh
다음을 수행할 수 있습니다.
shuffle() REPLY=$RANDOM
rm -f file_<->_[a-d].bin(.+shuffle[1,1024])
답변2
find
다음은 and 사용에 대한 잠재적인 대안입니다 shuf
.
$ find $destdir -type f | shuf | xargs rm -f
그러면 그 안에 있는 모든 파일을 찾아 명령을 사용하여 섞은 $destdir
다음 삭제할 shuf
목록을 전달합니다 .xargs rm -f
삭제된 파일 수를 제어하려면:
$ find $destdir -type f | shuf | head -X | xargs rm -f
-X
삭제하려는 파일 수는 어디에 있습니까 head -100
?