Как переместить определенное количество случайных файлов в ОС Unix/Linux

Я столкнулся с этой простой задачей, но мне также интересно, что это самый простой и короткий способ сделать это.

Мое предложение состоит в перемещении заданного количества случайных файлов из каталога в другой. Эта задача является частью создания двух наборов данных, которые мне нужны для машинного обучения: набора для обучения и набора тестов. Моя цель - отбросить 10% файла из каталога, чтобы получить атрибут datasat, который я мог бы проверить для моего классификатора, и получить учебный набор из исходного каталога.

Итак, какая самая компактная типизация для этой задачи "move n random files"?

Спасибо заранее - как обычно -

Ответ 1

Используйте комбинацию shuf и xargs (было бы неплохо взглянуть на их документацию с man):

shuf -n 10 -e * | xargs -i mv {} path-to-new-folder

Приведенная выше команда выбирает 10 случайных файлов из текущей папки (часть *) и затем перемещает их в новую папку.

Обновить

Хотя и дольше, может показаться, что эту версию еще проще понять:

ls | shuf -n 10 | xargs -i mv {} path-to-new-folder

shuf просто генерирует случайную перестановку стандартного ввода, ограничивая результаты до 10 (как при использовании head, но, вероятно, быстрее).

Ответ 2

Вы можете перетасовать список файлов, используя shuf или sort -R. Но вам все равно нужно взять подмножество, которое вы может делать с головой/хвостом.

Ответ 3

Вы можете использовать bash случайный генератор, который генерирует int между 0 и 32767, чтобы выбрать, должен ли файл быть помещен в set1 или set2. Это сделало бы:

for file in ./*; do
  val=$RANDOM
  if test $val -gt 3276; then
    mv "$file" ../set1
  else
    mv "$file" ../set2
  fi
done

Ответ 4

Обычно мы делаем это с помощью python script или Java-программы. Любой из них может использовать правильный RNG для принятия случайных решений, а затем вызывать необходимые вызовы для перемещения файлов.

Ответ 5

Вопрос довольно старый, но для записи это работает на OSX.

Вы должны установить gshuf с помощью brew install coreutils, а затем использовать:

tenpercent=$(('ls | wc -l' * 10/100))

ls | gshuf -n $tenpercent | xargs -I {} mv {} destination/path/