리눅스 | 디렉터리 및 중첩 디렉터리의 상위 100개 새 파일만 복사

리눅스 | 디렉터리 및 중첩 디렉터리의 상위 100개 새 파일만 복사

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=" 옵션을 사용해야 할 수도 있습니다.

관련 정보