특정 유형의 특정 수의 파일을 한 디렉터리에서 다른 디렉터리로 무작위로 복사합니다.

특정 유형의 특정 수의 파일을 한 디렉터리에서 다른 디렉터리로 무작위로 복사합니다.

때로는 jpg로 가득 찬 폴더가 있는데 그중 8개 정도를 무작위로 선택해야 하는 경우가 있습니다. 내 계정이 폴더에서 8개의 jpg를 무작위로 선택하여 다른 대상에 복사하도록 이를 자동화하려면 어떻게 해야 합니까?

cp내 문제는 정말 간단합니다. 파일 이름과 대상 파일 이름을 사용하고 지정하는 대신 폴더에서 8개의 .jpg를 무작위로 선택하여 다른 폴더에 복사하는 스크립트를 작성하고 싶습니다.

답변1

당신이 사용할 수있는 shuf:

shuf -zn8 -e *.jpg | xargs -0 cp -vt target/
  • shuf*.jpg현재 디렉터리의 파일 목록을 섞습니다.
  • -z특수 문자가 포함된 파일을 올바르게 처리하기 위해 각 줄을 0으로 끝내는 것입니다.
  • -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번 순환합니다.

관련 정보