특정 디렉토리 구조를 복사하고 함께 복사할 파일의 양을 무작위로 선택하는 우아하고 빠른 방법이 있습니까? 예를 들어 다음과 같은 구조가 있습니다.
--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
대상 디렉토리로 바꾸거나 세 번째 스크립트 옵션을 사용하십시오.
이 개념 증명은 내 테스트 디렉터리 내에서 실행되고 있지만 개선할 부분이 많을 수 있습니다.