Supposons qu'il existe un répertoire contenant 300 fichiers de données. Je souhaite sélectionner au hasard 200 de ces fichiers et les déplacer dans un autre répertoire. Existe-t-il un moyen de le faire sous Unix / Linux?
linux
shell
command-line
filesystems
directory
bit-question
la source
la source
list.files()
...shuf
ethead
(ou j'utiliserais simplementshuf -n
, j'aurais dû lire la page de manuel ...)Réponses:
Si votre système le possède
shuf
, vous pouvez l'utiliser très facilement (même en gérant les noms de fichiers laids):Si vous n'avez pas ,
shuf
mais unsort
qui prend-R
, cela devrait fonctionner:la source
shuf
n'est pas appelétros
car il fait le contraire du tri.)la source
Mettez tous les noms de fichiers dans un tableau nommé "fichiers" dans bash:
taille du tableau:
définissez 2/3 d'entre eux comme taille d'échantillon:
Cela sélectionnera les doublons et n'est
pastesté avec les noms de fichiers avec des blancs et autres.Le moyen le plus simple d'éviter les doublons est d'itérer sur tous les fichiers et de choisir chacun avec 2/3 de chance, mais cela ne conduira pas nécessairement à 200 fichiers.
Cela supprimera un fichier s'il a été choisi dans la liste et répondra à vos besoins:
la source
$RANDOM
ne peut avoir que des valeurs de 0 à 32767, donc cela ne fonctionnera pas correctement si vous avez plus de 32768 fichiers. De plus, la récupération est biaisée vers les premiers fichiers.Si cela doit être statistiquement aléatoire, vous ne devriez pas l'utiliser
RANDOM % ${#keys[@]}
. Considérer:$RANDOM
a 32768 valeurs uniquesAinsi, lors de la sélection du premier élément, il y a 110/32768 ~ = 0,33569% de chance pour chacun des 68 premiers éléments, et 109/32768 ~ = 0,33264% de chance pour chacun des 232 autres éléments à sélectionner. La sélection est répétée plusieurs fois avec des chances différentes, mais biaisée vers les premiers éléments à chaque fois
32768 % ${#keys[@]} -ne 0
, donc l'erreur se complique.Cela doit être non biaisé et fonctionne avec n'importe quel nom de fichier:
la source
La solution de Kevin fonctionne très bien! Quelque chose d'autre que j'ai beaucoup utilisé parce qu'il est plus facile de se souvenir du haut de ma tête est quelque chose comme:
la source
Un liner en bash:
la source