Как переместить определенное количество случайных файлов в ОС 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/