Supongamos que hay un directorio que contiene 300 archivos de datos. Quiero seleccionar al azar 200 de esos archivos y moverlos a otro directorio. ¿Hay alguna manera de hacerlo bajo Unix / Linux?
linux
shell
command-line
filesystems
directory
pregunta de bit
fuente
fuente
list.files()
...shuf
yhead
(o simplemente usaríashuf -n
, debería haber leído la página del manual ...)Respuestas:
Si su sistema lo tiene
shuf
, puede usar esto de manera bastante conveniente (incluso manejando nombres de archivo feos):Si no tiene
shuf
pero tiene unasort
que toma-R
, esto debería funcionar:fuente
shuf
no se llamatros
porque hace lo contrario de ordenar).fuente
Ponga todos los nombres de archivo en una matriz llamada "archivos" en bash:
tamaño de la matriz:
defina 2/3 de ellos como tamaño de muestra:
Esto seleccionará duplicados y se
noprobado con nombres de archivo con espacios en blanco y tal.La forma más sencilla de evitar duplicados es iterar sobre todos los archivos y elegir cada uno con una probabilidad de 2/3, pero esto no necesariamente conducirá a 200 archivos.
Esto eliminará un archivo si fue elegido de la lista y cumple con sus requisitos:
fuente
$RANDOM
solo puede tener valores de 0 a 32767, por lo que esto no funcionará correctamente si tiene más de 32768 archivos. Además, la obtención está sesgada hacia los primeros archivos.Si esto necesita ser estadísticamente aleatorio, no debe usarlo
RANDOM % ${#keys[@]}
. Considerar:$RANDOM
tiene 32768 valores únicosPor lo tanto, al seleccionar el primer elemento, hay un 110/32768 ~ = 0.33569% de probabilidad para cada uno de los 68 primeros elementos, y 109/32768 ~ = 0.33264% de probabilidad para cada uno de los otros 232 elementos para ser seleccionados. La selección se repite varias veces con diferentes posibilidades, pero siempre se inclina hacia los primeros elementos.
32768 % ${#keys[@]} -ne 0
, por lo que el error se agrava.Esto debe ser imparcial y funciona con cualquier nombre de archivo:
fuente
¡La solución de Kevin funciona muy bien! Algo más que he usado mucho porque me resulta más fácil recordar desde la parte superior de mi cabeza es algo como:
fuente
Un forro en bash:
fuente