如何按随机顺序删除所有一组文件?

如何按随机顺序删除所有一组文件?

我有一组文件,所有文件均按约定命名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.

相关内容