특정 디렉토리 구조를 복사하고 복사할 파일 수를 무작위로 선택하는 우아하고 빠른 방법이 있습니까? 예를 들어 다음과 같은 구조가 있습니다.
--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 {} \;
, 어느
- 대상 디렉터리 생성
- 임의의 수의 파일을 복사합니다.
이 예에서는 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
대상 디렉터리로 바꾸거나 세 번째 스크립트 옵션을 사용하세요.
이 개념 증명은 내 테스트 디렉터리에서 작동하지만 개선해야 할 부분이 많을 것입니다.