지정된 파일 크기 범위 내에서 파일 및 디렉터리 트리를 복사합니다.

지정된 파일 크기 범위 내에서 파일 및 디렉터리 트리를 복사합니다.

/pp/01 /pp/02/다른 디렉터리 예제 등의 파일을 동일한 디렉터리 디자인을 사용하여 다른 대상으로 복사하는 작은 스크립트를 만들고 싶습니다 . 하지만 88MB보다 크고 93MB보다 작은 디렉터리의 파일에만 해당됩니다.

for 루프와 find 함수를 사용하겠습니다. 더 효율적인 방법이 있나요? 그리고 검색 기능을 정확하게 구현하는 방법.

답변1

이 명령은 다음과 같습니다.

rsync -a --min-size 88m --max-size 93m pp /new_destination/

구조를 에서 로 복사 pp하되 /new_destination크기가 최소 88MB에서 최대 93MB인 파일만 복사합니다.

원하는 경우 최종 대상 지정자 앞에 더 많은 소스 트리를 추가할 수 있습니다. 예를 들면 다음과 같습니다.

rsync -a --min-size 88m --max-size 93m pp/01 pp/02 /target/

소스 사양에 후행 슬래시( pp/대신 )를 추가하면 pp대상 rsync에 디렉터리가 생성되지 않습니다.

즉, pp첫 번째 예에서 결과는 입니다 /new_destination/pp/01/.... 반면:

rsync -a --min-size 88m --max-size 93m pp/ /new_destination/

대신 결과는 /new_destination/01/..., 입니다 /new_destination/02/....

-ato 플래그는 rsync"아카이브"를 의미하며, 이는 디렉터리로 반복되어 권한 및 타임스탬프와 같은 파일의 메타데이터를 보존합니다. (이것은 -rlptgoD매우 인기 있는 옵션 조합 에 해당하는 편리한 옵션입니다 .)

답변2

나는 이것이 당신이 찾고 있는 것이라고 생각합니다:

$ find /file/location/ -type f -size +88M -size -93M \
    -exec cp {} /new/location/ \;`

이 명령은 88MB보다 크고 93MB보다 작은 파일만 찾습니다. 그런 다음 각 파일을 /new/location.

디렉토리 구조를 유지하는 것이 좀 더 어려워집니다. 나는 다음과 같이 문제를 해결할 것입니다 :

$ cd /pp
$ find . -type f -size +88M -size -93M -exec cp \
    --parents {} /new/location/pp \;

find이렇게 하면 반환된 파일 경로가 다음과 같이 표시 됩니다 01/myfile. 02/myfile상위 플래그를 켜면 cp슬래시 + 소스 파일의 지정된 이름이 추가됩니다.

예: find일치하는 파일을 찾아 "02/myfile"을 출력합니다. cp이 파일을 /new/location/pp/02/myfile생성하려는 디렉터리로 이동하세요.

답변3

파일 및 디렉터리 이름에 개행 문자가 포함되어 있지 않다고 가정하면 POSIXly는 다음과 같습니다.

cd /path/to/src/ &&
  find . -type f -size -"$((93 * 1024 * 1024))c" \
                 -size +"$((88 * 1024 * 1024))c" |
    pax -rw /path/to/dst/

답변4

"최소"에서 "최대" 크기 범위의 파일을 복사하고 디렉터리 구조를 다시 생성하려면 다음과 같은 방법을 사용하십시오.

MINSIZE=3k  
MAXSIZE=10k  
cd /source/dir && \
   find . -type f -size "+$MINSIZE" -size "-$MAXSIZE" | cpio -pvdm /target/path

cpio옵션

  • -p"통과" 모드는 나열된 각 파일을 지정된 디렉터리에 복사합니다.
  • -v"Verbose"는 생략할 수 있으며, 진행 상황에 대한 시각적 단서를 얻기 위해 각 파일에 점을 표시하려면 -V대신 사용하세요.
  • -d"필요에 따라 디렉토리 생성"
  • -m "보존 모드"(권한, 소유권)

관련 정보