如何将随机文件复制到特定文件夹?

如何将随机文件复制到特定文件夹?

我在多个文件夹和子文件夹中收集了大量文件(650 万个),我想随机选取一些文件(大约 20 万到 30 万个文件)复制到一个目录中以制作随机样本。

文件夹树是这样的(只是一个小示例)每个文件夹内都有几个文件

.
├── 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
.
.
.

答案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 之间)保存在 tempfile 中$awhile然后,循环将列表中的每个文件复制到/path/to/out/dir


胡说,我们根本不需要临时文件,我们只需将其通过管道传输到while循环,或者 – 我更喜欢 – 到trand 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

这样,您甚至可以通过“选项”指定每次调用cp应该接收多少个文件名。xargs-n

相关内容