모든 파일 세트를 무작위 순서로 삭제하는 방법은 무엇입니까?

모든 파일 세트를 무작위 순서로 삭제하는 방법은 무엇입니까?

규칙에 따라 이름이 지정된 파일 세트가 있습니다 file_[number]_[abcd].bin. 여기서 [숫자]는 0에서 드라이브 크기(MB 단위)까지의 숫자입니다. 즉, file_0_a.bin, file_0_b.bin, file_0_c.bin그리고 a 등이 file_0_d.bin됩니다 .01

파일 수는 파티션 크기를 기준으로 런타임 시 계산됩니다. 생성된 모든 파일을 삭제해야 하지만 의사 무작위 방식으로 삭제해야 합니다.지정할 수 있어야 하는 크기의 덩어리로즉, 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?

관련 정보