将一定数量的某种文件类型从一个目录随机复制到另一个目录

将一定数量的某种文件类型从一个目录随机复制到另一个目录

有时我有一个充满 jpg 的文件夹,我需要随机选择其中 8 个左右。我怎样才能自动执行此操作,以便我的帐户从文件夹中随机选择 8 张 jpg 并将它们复制到另一个目的地?

cp我的问题确实很简单,我想构建一个脚本,随机选择文件夹中的 8 个 .jpg,并将它们复制到另一个文件夹,而不是使用并为其指定文件名和目标文件名。

答案1

你可以使用shuf

shuf -zn8 -e *.jpg | xargs -0 cp -vt target/
  • shuf*.jpg随机排列当前目录中的文件列表。
  • -z是以零结束每一行,以便正确处理具有特殊字符的文件。
  • -n88 个文件后退出shuf
  • xargs -0读取由空字符(来自shuf -z)分隔的输入并运行cp
  • -v就是详细地打印每一份副本。
  • -t就是指定目标目录。

答案2

最好的答案绝对不适合我,因为-e *.jpg 实际上并没有查看工作目录。这只是一个表达。所以shuf不洗牌任何东西......

根据我在那篇文章中学到的知识,我发现了以下改进。

find /some/dir/ -type f -name "*.jpg" -print0 | xargs -0 shuf -e -n 8 -z | xargs -0 cp -vt /target/dir/

答案3

您也可以使用 Python 来完成此操作。

这是一个 python scscript,我用来移动随机百分比的图像,该脚本还获取 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

答案4

您可以通过以下方式检索文件:

files=(/tmp/*.jpg)
n=${#files[@]}
file_to_retrieve="${files[RANDOM % n]}"
cp $file_to_retrieve <destination>

循环8次。

相关内容