임의의 수의 파일로 디렉터리 구조 복사

임의의 수의 파일로 디렉터리 구조 복사

특정 디렉토리 구조를 복사하고 복사할 파일 수를 무작위로 선택하는 우아하고 빠른 방법이 있습니까? 예를 들어 다음과 같은 구조가 있습니다.

--MainDir
  --SubDir1
    --SubSubDir1
      --file1
      --file2
      --...
      --fileN
    --...
    --SubSubDirN
      --file1
      --file2
      --...
      --fileN
  --...

전체 폴더 구조를 복사하고 싶지만 각 SubSubDir의 {files1-filesN}에서 특정 개수의 임의 파일만 선택하여 복사합니다.

답변1

태그를 지정하셨으므로 linux저는 GNU 유틸리티를 사용하겠습니다.

디렉터리 구조를 에서 $src다음 으로 복사합니다 $dest.

find "$src" -type d -print0 | cpio -padmv0 "$dest"

$nfile또한 다음 각 리프 디렉터리에서 임의의 파일 샘플을 복사합니다 $src.

find "$src" -type d -links 2 -exec \
    sh -c 'find "$1" -type f -print0 | shuf -z -n "$2"' sh {} "$nfiles" \; | \
    cpio -padmv0  "$dest"

여기서 첫 번째는 find리프 디렉터리( )를 찾은 -links 2다음 두 번째는 find각 하위 디렉터리에서 파일을 찾습니다. shuf임의의 파일 샘플을 선택하고 마지막으로 cpio복사하십시오.

답변2

먼저 모든 디렉토리를 찾으십시오.

find MainDir -type d

그런 다음 이 디렉토리는 스크립트로 구문 분석됩니다.

find MainDir -type d -exec ./randomCopy.sh 2 {} \;

, 어느

  1. 대상 디렉터리 생성
  2. 임의의 수의 파일을 복사합니다.

이 예에서는 2개의 임의 파일이 복사됩니다.

내 예에서 스크립트는 randomCopy.sh다음과 같습니다.

#!/bin/bash                                                                                                                                                                                                                                                                    
cnt="$1"                                                                                                                                                                                                                                                                     
dir="$2"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
mkdir -p "TARGET/$dir"                                                                                                                                                                                                                                                       

# see: https://stackoverflow.com/questions/414164/how-can-i-select-random-files-from-a-directory-in-bash                                                                                                                                                                     
find "$dir" -maxdepth 1 -type f | sort -R | tail -n $cnt | while read file; do                                                                                                                                                                                               
  # copy the file                                                                                                                                                                                                                                                            
  cp "$file" "TARGET/$dir/"
done

그리고 스크립트를 실행 가능하게 만드는 것을 잊지 마세요: chmod +x randomCopy.sh.

문자열을 TARGET대상 디렉터리로 바꾸거나 세 번째 스크립트 옵션을 사용하세요.

이 개념 증명은 내 테스트 디렉터리에서 작동하지만 개선해야 할 부분이 많을 것입니다.

관련 정보