조건에 맞는 파일만 골라 다른 경로로 옮길 때 쓰는 형태를 정리한다. 파일 이름에 공백·따옴표·개행이 들어갈 수 있으므로 널 구분자(-print0 / -0)를 쓰는 형태를 기본으로 삼는다.
-exec ... \; 는 파일 하나마다 cp 를 한 번씩 실행한다. 느리지만 파일 이름 문제에 안전하다.
find /var/log -name '*.log' -exec cp -p {} /backup/ \;
\; 대신 + 를 쓰면 여러 인자를 모아 한 번에 실행한다. 대상 디렉터리가 마지막 인자여야 하므로 -t 로 먼저 지정한다.
find /var/log -name '*.log' -exec cp -pt /backup/ {} +
xargs 를 쓸 때는 널 구분자를 붙인다.
find /var/log -name '*.log' -print0 | xargs -0 cp -pt /backup/
이름이 같은 파일이 여러 디렉터리에 있으면 나중 것이 앞의 것을 덮는다. cp -n(덮어쓰지 않음) 을 붙이거나 아래의 구조 보존 방식을 쓴다.
GNU coreutils 의 cp --parents 는 원본 경로를 대상 아래에 그대로 만든다.
find /src -name '*.conf' -exec cp -p --parents {} /backup \;
# /src/app/config/a.conf -> /backup/src/app/config/a.conf
cd 로 기준 디렉터리를 바꾸면 접두 경로를 뺄 수 있다.
cd /src && find . -name '*.conf' -exec cp -p --parents {} /backup \;
# /backup/app/config/a.conf
--parents 는 POSIX 표준이 아니다. BusyBox · macOS 기본 cp 에는 없다.
파일 수가 많거나 원격으로 보낼 때는 개별 복사보다 스트림으로 넘기는 편이 빠르다. 권한·타임스탬프·심볼릭 링크도 그대로 유지된다.
# 로컬에서 묶기
find /data -name '*.csv' -print0 | tar --null -T - -cf backup_csv.tar
# 원격으로 바로 밀어 넣기
find /data -name '*.csv' -print0 | tar --null -T - -cf - | ssh user@target 'tar -xf - -C /backup'
scp 를 -exec 로 파일마다 부르는 형태는 접속을 매번 새로 맺으므로 파일이 많으면 매우 느리다.
find /data -type f -mtime -1 # 24시간 이내에 수정된 파일
find /data -type f -size +100M # 100MB 초과
find /data -type f -newermt '2026-01-01' # 지정 시각 이후 수정
find /data -type f \( -name '*.csv' -o -name '*.tsv' \)
지우거나 덮어쓰는 명령을 붙이기 전에 -exec 를 떼고 목록만 먼저 확인한다.