/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/...
.
-a
to 플래그는 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
"보존 모드"(권한, 소유권)