特定の種類の特定数のファイルをあるディレクトリから別のディレクトリにランダムにコピーします。

特定の種類の特定数のファイルをあるディレクトリから別のディレクトリにランダムにコピーします。

時にはjpgでいっぱいのフォルダがあり、そのうち8つ程度をランダムに選択する必要がある場合があります。自分のアカウントがフォルダ内の8つのjpgをランダムに選択して他のターゲットにコピーするように自動化するにはどうすればよいですか?

cp私の問題は本当に簡単です。ファイル名とターゲットファイル名を使用して指定するのではなく、フォルダから8つの.jpgをランダムに選択して別のフォルダにコピーするスクリプトを作成したいと思います。

答え1

あなたが使用できるshuf

shuf -zn8 -e *.jpg | xargs -0 cp -vt target/
  • shuf*.jpg現在のディレクトリのファイルのリストを混在させます。
  • -z特殊文字を含むファイルを正しく処理するために、各行をゼロで終わることです。
  • -n88個のファイル以降終了しますshuf
  • xargs -0null文字で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 イメージ・データ・セットに必要な関連ラベル・データ・セットもインポートします。テストトレーニングデータセットがトレーニングデータセットに存在することを望まないため、これはファイルを移動します。

ラベルと画像が同じディレクトリにあり、ラベルがtxtファイルなので、以下のYoloトレーニングセットを使用しています。

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回循環します。

関連情報