busybox version 1.33.0
폴더 전체를 복사하려고 합니다 home
.
home
설치된 내부는 /dev/sda2/
다음과 같습니다.
/home/user/sda2
/home/user/sda2/root
/home/user/sda2/home_backup
root/
위에서는 실제로 가지고 있는 디렉토리를 볼 수 있습니다 . 또한 의 데이터를 저장하는 것이 있습니다.sda2/
root
home_backup/
/home
내 질문은 다음과 같습니다
다음 줄을 실행하면 멋진 파일 목록과 /home/user/sda2
해당 내용을 찾을 수 없습니다. 이것이 바로 제가 원하는 것입니다.
LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -print \;
그러나 다음과 같은 경우 항상 operation not permitted
디렉터리 오류가 발생합니다 root/
(정확히 말하면 저는 소유자나 일반 사용자가 아닙니다). 이는 sda2
예상한 대로 정리되지 않음을 의미합니다.
LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -exec cp -r '{}' /home/user/sda2/home_backup/ ;/
명백한 이유로 배제되어야 하며 /home/user/sda2
동일한 데이터를 반복해서 복사하지 마십시오.
이것을 확인한다고 해서 실제로 내 질문에 대한 답은 아니지만 prune
이것이 어떻게 작동하는지에 대한 아이디어를 얻을 수 있습니다.
https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh/1489405#1489405
편집하다
방금 이전 줄에서 모든 파일이 함께 혼합되어 있다는 것을 깨달았 home_backup
지만 그것은 문제가 아닙니다. 왜 제대로 "트림"할 수 없는지 여전히 궁금합니다.
답변1
명령에 몇 가지 문제가 있습니다. 그러나 가장 중요한 것은 cp -r
.
이 명령은 자신을 find /home ... -iname '*'
포함하여 모든 파일 및 디렉터리와 일치한다는 것입니다 /home
. 따라서 실행 cp -r /home /home/user/sda2/home_backup/
되고 해당 설치가 포함됩니다.
이를 수행하는 합리적인 방법은 없습니다 find
. 기본적으로 작업에 잘못된 도구를 사용하고 있습니다. 사용 rsync
. -x
설치를 반복적으로 복사하지 않도록 옵션을 전달합니다 .
rsync -aHAXx /home /home/user/sda2/home_backup
어떤 이유로든 이 방법이 효과가 없거나 rsync
정말로 그렇게 하고 싶다면 find
여러 단계를 거쳐 이 작업을 수행해야 합니다.
첫 번째 단계는 디렉터리 구조를 만드는 것입니다.
find /home -mount -type d -execdir mkdir -p /home/user/sda2/home_backup/{} \;
-mount
대체 사용에 유의하세요 -prune
. 을 사용할 수 있지만 -prune
더 -mount
간단합니다. 또한 의 사용에 유의하세요 -execdir
. 이는 {}
절대 경로가 아닌 상대 경로로 대체되기 때문입니다. 원한다면 /home/user/sda2/home_backup/home/...
를 사용할 수 있습니다 -exec
.
그런 다음 파일을 복사해야합니다
find /home -mount \! -type d -execdir cp -a {} /home/user/sda2/home_backup/{} \;
파일을 일치시키기 위해 디렉토리를 제외한 모든 것을 일치시킵니다. 이는 심볼릭 링크 및 파이프와 같은 비파일을 복사합니다.
이를 하나의 find
명령으로 결합할 수 있지만 그렇게 하면 상황이 더 혼란스러워질 뿐입니다.
이러한 모든 뉘앙스로 인해 rsync
이것이 더 나은 선택입니다.