무작위 확률로 파일 복사

무작위 확률로 파일 복사

나는 직접적인 완전한 이미지를 가지고 있으며 이미지를 임의의 이름으로 해당 대상에 무작위로(확률적으로) 복사하는 스크립트/명령을 구성하려고 합니다. 현재 파일 충돌이 있습니다). 또한 문제를 복잡하게 만드는 것은 파일에 공백이 포함되어 있고 작업 중인 파일이 30GB라는 점입니다.

이것이 내가 지금까지 가지고 있는 것입니다. 이 파일 공간은 킬러입니다

#!/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

Glenn의 의견을 바탕으로 다음과 같은 결과를 얻었습니다.

#!/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이 됨).

관련 정보