Предположим, есть каталог, содержащий 300 файлов данных. Я хочу случайным образом выбрать 200 из этих файлов и переместить их в другой каталог. Есть ли способ сделать это под Unix / Linux?
linux
shell
command-line
filesystems
directory
бит вопрос
источник
источник
list.files()
...shuf
иhead
(или просто используюshuf -n
, должен был прочитать страницу руководства ...)Ответы:
Если ваша система имеет
shuf
, вы можете использовать это довольно удобно (даже обрабатывая уродливые имена файлов):Если у вас нет,
shuf
но есть,sort
что нужно-R
, это должно работать:источник
shuf
, не вызывается,tros
потому что это противоположно сортировке.)источник
Поместите все имена файлов в массив с именем "files" в bash:
размер массива:
определите 2/3 из них как размер выборки:
Это будет выбрать дубликаты, и это
непротестировано с именами файлов с пробелами и такими.Самый простой способ избежать дублирования - перебирать все файлы и выбирать каждый с вероятностью 2/3, но это не обязательно приведет к 200 файлам.
Это удалит файл, если он был выбран из списка, и выполнит ваши требования:
источник
$RANDOM
может иметь значения только от 0 до 32767, поэтому это не будет работать должным образом, если у вас более 32768 файлов. Кроме того, выборка смещена к первым файлам.Если это должно быть статистически случайным, вы не должны использовать
RANDOM % ${#keys[@]}
. Рассмотреть возможность:$RANDOM
имеет 32768 уникальных значенийТаким образом, при выборе первого элемента есть вероятность 110/32768 ~ = 0,33569% для каждого из 68 первых элементов, а вероятность 109/32768 ~ = 0,33264% для каждого из остальных 232 элементов, которые будут выбраны. Сбор повторяется несколько раз с разными шансами, но всегда смещен к первым элементам
32768 % ${#keys[@]} -ne 0
, поэтому ошибка усугубляется.Это должно быть беспристрастным , и работает с любым именем файла:
источник
Решение Кевина прекрасно работает! Что-то еще, что я часто использовал, потому что мне легче вспомнить с головы до головы, это что-то вроде:
источник
Один лайнер в Bash:
источник