我正面临这个简单的任务,但是,我也想知道最简单、最快捷的方法是什么。
我的建议是将给定数量的随机文件从一个目录移动到另一个目录。此任务是创建机器学习所需的两个数据集的一部分:一个训练集和一个测试集。我的目标是从目录中移走 10% 的文件,以便获得可以测试分类器的数据卫星,并从源目录中获取训练集。
那么,对于这个“移动 n 个随机文件”任务,最紧凑的类型是什么?
提前谢谢 - 像往常一样 -
使用shuf
and的组合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
,但可能更快)。
您可以使用生成 0 到 32767 之间的 int 的 bash 随机生成器来选择文件是否必须放在 set1 或 set2 中。那会做:
for file in ./*; do
val=$RANDOM
if test $val -gt 3276; then
mv "$file" ../set1
else
mv "$file" ../set2
fi
done
find
用于避免文件夹问题的替代版本。它将 31415 个随机选择的文件复制到/home/user/dir/
find . -maxdepth 1 -type f | sort -R | head -31415 | xargs cp -t /home/user/dir/
您可以使用 shuf 或 sort -R 打乱文件列表。但是你仍然需要获取一个子集,你可以用头/尾来做。
这个问题已经很老了,但为了记录,这适用于 OSX。
您必须使用 安装gshuf
,brew install coreutils
然后使用:
tenpercent=$((`ls | wc -l` * 10/100))
ls | gshuf -n $tenpercent | xargs -I {} mv {} destination/path/
你也可以用 Python 做到这一点。我觉得这更容易。
这是我用来移动随机百分比的图像的 python 脚本,该脚本还获取 CV 图像数据集通常需要的相关标签数据集。请注意,这会移动文件,因为我不希望在我的训练数据集中我的测试训练数据集。
我将以下内容用于 Yolo 训练集,因为标签和图像位于同一目录中,并且标签是 txt 文件。
import numpy as np
import os
import random
#set directories
directory = str('/MauiData/maui_complete_sf_train')
target_directory = str('/MauiData/maui_complete_sf_test')
data_set_percent_size = float(0.07)
#print(os.listdir(directory))
# list all files in dir that are an image
files = [f for f in os.listdir(directory) if f.endswith('.jpg')]
#print(files)
# select a percent of the files randomly
random_files = random.sample(files, int(len(files)*data_set_percent_size))
#random_files = np.random.choice(files, int(len(files)*data_set_percent_size))
#print(random_files)
# move the randomly selected images by renaming directory
for random_file_name in random_files:
#print(directory+'/'+random_file_name)
#print(target_directory+'/'+random_file_name)
os.rename(directory+'/'+random_file_name, target_directory+'/'+random_file_name)
continue
# move the relevant labels for the randomly selected images
for image_labels in random_files:
# strip extension and add .txt to find corellating label file then rename directory.
os.rename(directory+'/'+(os.path.splitext(image_labels)[0]+'.txt'), target_directory+'/'+(os.path.splitext(image_labels)[0]+'.txt'))
continue
通常,我们使用 python 脚本或 Java 程序来执行此操作。其中任何一个都可以使用适当的 RNG 来做出随机决定,然后调用必要的调用来移动文件。