디렉토리를 정리할 수 없는 이유는 무엇입니까?

디렉토리를 정리할 수 없는 이유는 무엇입니까?

busybox version 1.33.0

폴더 전체를 복사하려고 합니다 home.

home설치된 내부는 /dev/sda2/다음과 같습니다.

/home/user/sda2
/home/user/sda2/root
/home/user/sda2/home_backup

root/위에서는 실제로 가지고 있는 디렉토리를 볼 수 있습니다 . 또한 의 데이터를 저장하는 것이 있습니다.sda2/roothome_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이것이 더 나은 선택입니다.

관련 정보