32

我正面临这个简单的任务,但是,我也想知道最简单、最快捷的方法是什么。

我的建议是将给定数量的随机文件从一个目录移动到另一个目录。此任务是创建机器学习所需的两个数据集的一部分:一个训练集和一个测试集。我的目标是从目录中移走 10% 的文件,以便获得可以测试分类器的数据卫星,并从源目录中获取训练集。

那么,对于这个“移动 n 个随机文件”任务,最紧凑的类型是什么?

提前谢谢 - 像往常一样 -

4

7 回答 7

62

使用shufand的组合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,但可能更快)。

于 2014-05-17T18:32:51.183 回答
3

您可以使用生成 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
于 2012-12-25T20:44:00.203 回答
3

find用于避免文件夹问题的替代版本。它将 31415 个随机选择的文件复制到/home/user/dir/

find . -maxdepth 1 -type f | sort -R | head -31415 | xargs cp -t /home/user/dir/
于 2021-01-13T15:45:47.573 回答
2

您可以使用 shuf 或 sort -R 打乱文件列表。但是你仍然需要获取一个子集,你可以用头/尾来做。

于 2012-12-25T19:13:33.350 回答
2

这个问题已经很老了,但为了记录,这适用于 OSX。

您必须使用 安装gshufbrew install coreutils然后使用:

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

ls | gshuf -n $tenpercent | xargs -I {} mv {} destination/path/
于 2019-05-24T09:44:40.450 回答
2

你也可以用 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
于 2020-11-28T23:24:14.587 回答
0

通常,我们使用 python 脚本或 Java 程序来执行此操作。其中任何一个都可以使用适当的 RNG 来做出随机决定,然后调用必要的调用来移动文件。

于 2012-12-25T18:50:39.287 回答