如何以隨機順序刪除所有一組檔案?

如何以隨機順序刪除所有一組檔案?

我有一組文件,所有文件均按約定命名file_[number]_[abcd].bin(其中 [number] 是驅動器大小 0 範圍內的數字,以 MB 為單位)。即有file_0_a.bin, file_0_b.bin,file_0_c.bin然後file_0_d.bin就會0變成 a1等等。

文件的數量是在運行時根據分區的大小計算出來的。我需要刪除所有已建立的文件,但以偽隨機方式。以我需要能夠指定的大小塊為單位,也就是有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.

相關內容