모든 파일 세트를 무작위 순서로 삭제하려면 어떻게 해야 합니까?

모든 파일 세트를 무작위 순서로 삭제하려면 어떻게 해야 합니까?

규칙에 따라 이름이 지정된 파일 세트가 있습니다 file_[number]_[abcd].bin(여기서 [숫자]는 드라이브 크기 0 범위의 숫자(MB)). 즉 file_0_a.bin, file_0_b.bin, , file_0_c.bin그리고 file_0_d.bin는 a 등이 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다음은 및 를 사용하는 잠재적인 대안입니다 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?

관련 정보