
AzureVM/Ubuntu에 아래와 같은 저장소가 있습니다.
-/A
-/B --> 10000 log files
-/C --> 100000 log files
-/D --> 200000 images
summary.xml
-/data --> 1000 csv files
이제 데이터 크기가 계산하고 거기에서 어떤 작업을 수행하기에는 매우 크기 때문에 이 데이터의 샘플을 가져와 데이터 분석 코드를 개발하고 싶습니다.
각 디렉터리와 중첩된 디렉터리에 100개의 최신 파일이 있고 루트에 있는 모든 파일이 이와 같은 다른 위치에 하위 집합을 복사하고 싶습니다.
-/New_Location
-/B --> 100 log files
-/C --> 100 log files
-/D --> 100 images
summary.xml
-/data --> 100 csv files
cp를 기반으로 여러 명령을 시도했지만 아무것도 작동하지 않고 실행하는 데 너무 많은 시간이 걸립니다.
누군가 나를 도와줄 수 있나요?
답변1
일반적으로 이를 세 가지 작업으로 나눌 수 있습니다. 여기서는 디렉터리 구조로 시작하고 다음으로 파일을 100개로 제한합니다. 마지막 부분은성냥나머지 파일의 범위를 확대합니다.
#!/bin/bash
# Example START
[[ ! -d A/ ]] && { \
mkdir -p \
A/{tmp/folder,\
{A..Z}}/{images,data} && \
printf %s\\0 \
A/{summary.xml,\
tmp/De5Loh4X.tmp,\
{A..Z}/{{1..1000}_file.log,\
images/{1..1000}_pic.{jpg,png},\
data/example.csv}} | xargs -0 touch; }
### Example END
set -o noglob
source=A
target=target
number=100
# prune="-false"
prune="-type d -path $source/tmp -prune"
match='-name *.log -o -name *.jpg -o -name *.png'
echo Create directory structure.
find "$source" \
\( $prune -o -type d -links 2 \) -printf %P\\0 | cpio -0 -pvdm -D "$source" "$target"
echo Copy 100 files.
while IFS= read -rd ''; do
find "$REPLY" \
-maxdepth 1 -type f \( $match \) -printf '%T@\t%P\0' | sort -zk1rn | cut -zf2- | head -zn $number | cpio -0 -pvdm -D "$REPLY" "$target/${REPLY/#$source\//}"
done < <( \
find "$source" \
\( $prune -false -o -type f \) -printf %h\\0 | sort -zu \
)
echo Copy everything else.
find "$source" \
\( $prune -false -o -type f ! \( $match \) \) -printf %P\\0 | cpio -0 -pvdm -D "$source" "$target"
답변2
이는 선택적 보관을 통해 쉽게 수행할 수 있습니다. 파일(의도한 파일만)을 타르볼링한 다음 다른 곳에 타르볼을 추출할 수 있습니다. 나는 귀하의 로그 파일이 번호 매기기(예: log1, log2 등)를 제외하고 동일한 이름을 가지고 있다고 가정합니다. 따라서 처음 100개 파일은 tarball 명령에서 log{1..100}으로 정의될 수 있습니다. 예를 들어:
tar -cvf copied.tar <path1>/log{1..100} <path2>/log({1..100}
등
추출하면 원래 파일 구조가 새 위치에 다시 생성됩니다. 따라서 혼란을 피하기 위해 중복된 선행 디렉토리를 자르려면 "--strip-comComponents=" 옵션을 사용해야 할 수도 있습니다.