Лучший метод для сбора случайной выборки из набора файлов

Ваша проблема определенно, кажется, заключается в конфигурации DNS. Большое общее руководство по поиску и устранению неисправностей, записанное Shawn, содержит большую полезную информацию и на основе его, Вы могли бы проверить, соединена ли проблема с DNS. Добавляя к предложениям Shawn, я рекомендовал бы Вам попытаться вручную разрешить использование имени хоста host как это (microsoft.com просто хороший пример ;)):

host microsoft.com

(это не должно приводить ни к какому результату, если серверы DNS не, настраивает правильно), и затем

host microsoft.com 8.8.8.8

- на этот раз Вы говорите host оснастите явно, какой сервер имен это должно запросить. Это должно работать независимо от какой Ваш /etc/resolv.conf файл содержит.

Кроме того, то, что Ваше проводное соединение хорошо работает, могло бы быть и подсказкой и средством исследования проблемы далее. Я предлагаю, чтобы Вы сделали:

  1. Подключение, хотя провод, проверьте работы просмотра веб-страниц и затем скопируйте Ваш /etc/resolv.conf к некоторому временному месту как /tmp/resolv1.

  2. Отсоедините провод и подключение через беспроводную связь. После установления соединения (можно сделать a ping 8.8.8.8 для тестирования этого) скопируйте содержание /etc/resolv.conf во второй временный файл сказать tmp/resolv2.

  3. Сравните два скопированных файла. Первый должен содержать серверы имени собственного, второе не могло бы содержать ни один или единственную неподходящую запись, такую как Ваш адрес шлюза (обычно 192.168.1.1 или 192.168.0.1).

К настоящему времени Вы, вероятно, понимаете, почему определение имен (обычно необходимый для просмотра веб-страниц) не работает с Вашей конфигурацией радиоресурсов. Однако это могло бы быть не очевидно где проблемные источники из.

Обычно (n стандартные настольные дистрибутивы), сетями управляет программа GUI как NetworkManager или wicd. Это оснащает, используются, чтобы легко определить, как проводные и беспроводные интерфейсы должны соединиться с сетью и в каждом случае, какая информация должна быть запрошена с сервера DHCP.

Так, наконец, я полагаю, что для решения проблемы просто необходимо открыть конфигурацию сети программа GUI и проверить, как параметры конфигурации для проводного и беспроводного интерфейса отличаются. Это могло быть, например, что проводной интерфейс просто использует статическую конфигурацию и IP-адреса и DNS. Другая опция состоит в том, что оба интерфейса используют DHCP, но у каждого есть некоторая опция, отмеченная для использования статического DNS (они могут быть определены в другом месте).

24
10.05.2012, 17:34
5 ответов

Если Ваша система имеет shuf, можно использовать это вполне удобно (даже обрабатывающий ужасные имена файлов):

shuf -zen200 source/* | xargs -0 mv -t dest

Если Вы не имеете shuf но имейте a sort это берет -R, это должно работать:

find source -type f -print0 | sort -Rz | cut -d $'\0' -f-200 | xargs -0 mv -t dest
33
27.01.2020, 19:41
  • 1
    да, потому что, где еще был бы, каждый ищет перестановку, чем в инструменте для сортировки. (По крайней мере, shuf не назван tros потому что это делает противоположность сортировки.) –  Ulrich Schwarz 10.05.2012, 19:52
  • 2
    Нет такой вещи как противоположность сортировки (в том же смысле, поскольку нет такой вещи как "никакая погода"). Случайный все еще отсортирован, это просто отсортировано случайным образом. использование –  Plutor 10.05.2012, 23:43
  • 3
    Каков "-zen200"? Это не находится ни в одной документации для shuf, или нигде в Интернете, но Ваш пример не работает без него. Довольно мистический. –  SigmaX 17.02.2015, 23:56
  • 4
    @SigmaX Действительно, вполне дзэн, не является этим. Подсказка: это - 3 отдельных флага. –  Kevin 18.02.2015, 00:05
files=(*)
for (( i=0; i<200; i++ )); do
    keys=("${!files[@]}")
    rnd=$(( RANDOM % ${#keys[@]} ))
    key=${keys[$rnd]}
    mv "${files[$key]}" "$otherdir"
    unset files[$key]
done
2
27.01.2020, 19:41

Поместите все имена файлов в массив, названный "файлами" в ударе:

files=( * )

размер массива:

echo ${#files[@]}

определите 2/3 их как объем выборки:

take=$((2*${#files[@]}/3)) 

for i in $(seq 1 $take)
do
    r=$((RANDOM%${#files[@]})) 
    echo ${files[r]}
done

Это выберет дубликаты и не тестируется с именами файлов с пробелами и таким.

Самый простой способ избежать дубликатов, чтобы выполнить итерации по всем файлам и выбрать каждого с 2/3 шансом, но это не обязательно приведет к 200 файлам.

Это удалит файл, если он был выбран из списка, и выполните свои требования:

#!/bin/bash
files=( * )
# define 2/3 of them as sample size:
take=$((2*${#files[@]}/3)) 

while (( i < $take ))
do
    r=$((RANDOM%${#files[@]})) 
    f=${files[r]}
    if [[ -n $f ]]
    then 
        i=$((i+1))    
        echo ${files[r]}
        unset files[r]    
    fi
done
2
27.01.2020, 19:41
  • 1
    Вы могли бы выбрать тот же файл несколько раз. –  glenn jackman 10.05.2012, 17:43
  • 2
    Очень хороший сценарий оболочки. Для обхождения проблемы не получения 200 файлов Вы, вероятно, хотите использовать Выборку Водохранилища: en.wikipedia.org/wiki/Reservoir_sampling я собираюсь быть слабым и не включаю пример сценария оболочки этого. –  Bruce Ediger 10.05.2012, 17:51
  • 3
    @glennjackman: Я записал так, да. Необходимый несколько минут для выяснения, как удалить записи из массива. –  user unknown 10.05.2012, 17:53
  • 4
    Незначительный протест: $RANDOM может только иметь значения 0 до 32 767, таким образом, это не будет работать правильно, если у Вас будет больше чем 32 768 файлов. Кроме того, выборка склоняется к первым файлам. –  l0b0 10.05.2012, 18:02
  • 5
    @l0b0: Требования, где, для выбора 200 от 300. Если файлы не будут в текущем каталоге, а на файловом сервере, то он не будет работать также. Различные требования, другой ответ. –  user unknown 10.05.2012, 18:05

Если это должно быть статистически случайно, Вы не должны использовать RANDOM % ${#keys[@]}. Рассмотрите:

  1. $RANDOM имеет 32 768 уникальных значений
  2. Первый выбор 1 из 300 элементов
  3. 32768 = 109 * 300 + 68

Таким образом, при выборе первого объекта, существует 110/32768 ~ = шанс на 0,33569% для каждого из 68 первых элементов и 109/32768 ~ = шанс на 0,33264% для каждого из других 232 элементов, которые будут выбраны. Выбор несколько раз повторяется с различными возможностями, но склоняется к первым элементам каждый раз, когда 32768 % ${#keys[@]} -ne 0, так ошибочные составные объекты.

Это должно быть несмещенным, и работы с любым именем файла:

while IFS= read -r -d '' -u 9
do
    mv -- "$REPLY" /target/dir
done 9< <(find /source/dir -mindepth 1 -print0 | shuf -n 200 -z)
2
27.01.2020, 19:41

Один лайнер в bash:

ls original_directory/|sort -R|head -number_of_files_to_move|while read file; do cp "new_directory/"$file test; done
0
27.01.2020, 19:41

Теги

Похожие вопросы