Załóżmy, że istnieje katalog zawierający 300 plików danych. Chcę losowo wybrać 200 z tych plików i przenieść je do innego katalogu. Czy jest na to sposób w Unix / Linux?
linux
shell
command-line
filesystems
directory
pytanie bitowe
źródło
źródło
list.files()
...shuf
ihead
(lub po prostu użyćshuf -n
, powinienem był przeczytać stronę podręcznika ...)Odpowiedzi:
Jeśli twój system ma
shuf
, możesz użyć tego dość wygodnie (nawet radząc sobie z brzydkimi nazwami plików):Jeśli nie mają
shuf
, ale mająsort
to trwa-R
, to powinno działać:źródło
shuf
nie jest wywoływany,tros
ponieważ działa odwrotnie niż sortowanie).źródło
Umieść wszystkie nazwy plików w tablicy o nazwie „pliki” w bash:
rozmiar tablicy:
zdefiniuj 2/3 z nich jako wielkość próby:
Spowoduje to wybranie duplikatów i tak jest
nietestowane z nazwami plików z półfabrykatów i takie.Najprostszym sposobem uniknięcia duplikatów jest iteracja wszystkich plików i wybranie każdego z szansą 2/3, ale niekoniecznie doprowadzi to do 200 plików.
Spowoduje to usunięcie pliku, jeśli został wybrany z listy i spełni twoje wymagania:
źródło
$RANDOM
może mieć tylko wartości od 0 do 32767, więc nie będzie działać poprawnie, jeśli masz więcej niż 32768 plików. Ponadto pobieranie jest ukierunkowane na pierwsze pliki.Jeśli to musi być statystycznie losowe, nie powinieneś używać
RANDOM % ${#keys[@]}
. Rozważać:$RANDOM
ma 32768 unikalnych wartościTak więc, wybierając pierwszy element, istnieje szansa 110/32768 ~ = 0,33569% dla każdego z 68 pierwszych elementów i 109/32768 ~ = 0,33264% szansy na każdy z pozostałych 232 elementów do wyboru. Wybieranie jest powtarzane kilka razy z różnymi szansami, ale zawsze jest ukierunkowane na pierwsze elementy
32768 % ${#keys[@]} -ne 0
, więc błąd się pogłębia.Powinno to być bezstronne i działa z dowolną nazwą pliku:
źródło
Rozwiązanie Kevina działa świetnie! Coś innego, z czego często korzystałem, ponieważ łatwiej jest zapamiętać to z góry:
źródło
Jedna wkładka w bash:
źródło