Как скопировать случайные файлы в определенную папку?

У меня есть обширный набор файлов (6,5 миллионов) в нескольких папках и подпапках, и я хочу скопировать некоторые случайные выборы (о 200k-300k файлах) к каталогу для создания рандомизированного образца.

дерево папки - это (просто небольшая выборка) в каждой папке существует несколько файлов

.
├── articles.0-9A-B.txt
│  ├── 20_Century_Br_Hist
│  ├── 3_Biotech
│  ├── A_A_Case_Rep
│  ├── AAPS_J
│  ├── AAPS_PharmSciTech
│  ├── Abdom_Imaging
│  ├── Abdom_Radiol
│  ├── Abdom_Radiol_(NY)
│  ├── Acad_Emerg_Med
│  ├── Acad_Med
│  ├── Acad_Psychiatry
│  ├── Acad_Radiol
│  ├── Acc_Chem_Res
.
.
.
│  ├── Bull_Sci_Technol_Soc
│  ├── Bull_Volcanol
│  ├── Bull_World_Health_Organ
│  ├── Bundesgesundheitsblatt_Gesundheitsforschung_Gesundheitsschutz
│  ├── Burn_Res
│  ├── Burns
│  ├── Burns_Trauma
│  └── Bus_Soc
├── articles.A-B.xml
│  ├── 20_Century_Br_Hist
│  ├── 3_Biotech
│  ├── A_A_Case_Rep
│  ├── AAPS_J
│  ├── AAPS_PharmSciTech
│  ├── Abdom_Imaging
.
.
.
3
задан 17 November 2017 в 14:58

1 ответ

Обычно это был бы единственный способ, но может быть плохой идеей обрабатывать такое огромное количество файлов (имен) напрямую, поэтому я буду использовать временный файл здесь.

#!/bin/bash
a=$(mktemp)
find /path/to/dir -type f | shuf -n $(shuf -i200000-300000 -n1) >$a
while IFS='' read -r l || [[ -n "$l" ]]; do
    cp "$l" /path/to/out/dir
done <$a

Это найдет каждый файл, расположенный в /path/to/dir, перемешает их и сохранит случайное количество строк (от 200 000 до 300 000 по запросу) вывода в временном файле $a. Затем цикл while просто копирует каждый файл в списке в /path/to/out/dir.


Ерунда, нам вообще не нужен временный файл, мы просто направляем его в цикл while или - что я предпочитаю - в tr и xargs:

#!/bin/bash
find /path/to/dir -type f | shuf -n $(shuf -i200000-300000 -n1) |\
tr '\n' '\0' | xargs -0 -n1 cp -t /path/to/out/dir
[ 1115] Таким образом, вы даже можете указать, сколько имен файлов должен получать каждый вызов cp с помощью опции xargs '-n.

5
ответ дан 1 December 2019 в 15:33

Другие вопросы по тегам:

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