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

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

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

--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대상 디렉토리로 바꾸거나 세 번째 스크립트 옵션을 사용하십시오.

이 개념 증명은 내 테스트 디렉터리 내에서 실행되고 있지만 개선할 부분이 많을 수 있습니다.

관련 정보