以随机概率复制文件

以随机概率复制文件

我有一个直接完整的图像,我试图组合一个脚本/命令,将图像随机复制(有一定的可能性)到该目的地具有随机名称的位置(因为我可能只想将其复制到位并且不与现有文件冲突)。同样使问题复杂化的是,该文件中包含空格,而我正在处理的文件有 30 GB

这是我到目前为止所拥有的。这些文件空间是一个杀手

#!/bin/bash

for i in $(find pics/ -type f);  do
        v=$(($RANDOM % 2))
        if [ $v -eq 0 ]; then
                cp $i dups/$RANDOM.jpg;
        fi
done

我最终会喜欢这样的东西:

./rcp.sh 源/目标/

我看过

洗牌

但它也没有让我解决文件名中的空格问题。也许有一种方法可以采取并且它也进行随机播放吗?

答案1

处理带有空格的文件的方法是使用-print0GNU find 的指令和-dbash 命令的选项read。引用也是必要的"$variable"

find pics/ -type f -print0 | while IFS= read -rd "" filename; do
    v=$((RANDOM % 2))
    if (( v == 0 )); then
        cp "$filename" dups/$RANDOM.jpg
    fi
done

IFS=-r用于确保命令正确处理空格和反斜杠read

(( ... ))算术表达式中,您可以给出不带$.

答案2

RAND_FILE=$( find pics/ -type f -print0 | shuf -n 1 -z )
# TODO check that RAND_FILE actually got a file, e.g. what
# if pics/ dir is empty, what happens?
cp "$RAND_FILE" ...

不过,如果副本位于同一文件系统上,并且副本文件不会被修改,则硬链接副本会节省空间。

答案3

根据格伦的输入,我有:

#!/bin/bash

if [ ! -d "$2" ]; then
    mkdir -p $2 
fi

find $1/ -type f -print0 | while IFS= read -rd "" filename; do
    v=$((RANDOM % 4))
    if (( v == 0 )); then
        cp "$filename" $2/`uuidgen`.jpg
    fi
done

我添加了

乌伊德根

因为 $RANDOM 没有提供足够大的数字空间来消除冲突。使此脚本更好的一种方法是使用数字作为概率百分比,而不仅仅是 1/n 的分数(只有 1/n 数字将是 $RANDOM % n == 0)

相关内容