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