我有一个直接完整的图像,我试图组合一个脚本/命令,将图像随机复制(有一定的可能性)到该目的地具有随机名称的位置(因为我可能只想将其复制到位并且不与现有文件冲突)。同样使问题复杂化的是,该文件中包含空格,而我正在处理的文件有 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
处理带有空格的文件的方法是使用-print0
GNU find 的指令和-d
bash 命令的选项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)