Duplicar um arquivo com probabilidade aleatória

2

Eu tenho um diretamente cheio de imagens e estou tentando montar um script / comando que irá copiar aleatoriamente (com alguma probabilidade) a imagem para um local com um nome aleatório naquele destino (porque eu poderia apenas querer copiar no lugar e não colidir com o arquivo existente). Também é complicado que o arquivo tenha espaços e eu tenho 30 gb de arquivos com os quais estou trabalhando

Aqui está o que eu tenho até agora. Esses espaços de arquivo são um assassino

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

Eu acabaria gostando de algo como:

./rcp.sh source/ destination/

Eu olhei para

shuff

mas também não me ultrapassa os problemas de nomes do espaço no arquivo. Talvez haja uma maneira de fazer esta e também fazer o shuffle?

    
por Christian Bongiorno 14.08.2015 / 00:55

3 respostas

2

A maneira de manipular arquivos com espaços é usar a diretiva -print0 para encontrar o GNU e a opção -d para o comando read do bash. Também é imperativo citar o "$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

Os bits IFS= e -r garantem que os espaços e barras invertidas sejam manipulados corretamente pelo comando read .

Dentro de expressões aritméticas (( ... )) , você pode fornecer variáveis shell sem o $ .

    
por 14.08.2015 / 01:05
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" ...

Embora a vinculação difícil da cópia economize espaço se estiver no mesmo sistema de arquivos e o arquivo duplicado não for modificado.

    
por 14.08.2015 / 01:25
0

Com base na entrada de Glenn, eu tenho:

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

eu adicionei

uuidgen

porque $ RANDOM não forneceu um espaço numérico grande o suficiente para eliminar a colisão. Uma maneira de tornar este script melhor seria usar um número como porcentagem de probabilidade e não simplesmente como uma fração de 1 / n (somente números 1 / n serão $ RANDOM% n == 0)

    
por 19.08.2015 / 20:45