재귀적으로 백업하는 것은 디렉터리를 복사하는 것이 아닙니다.

재귀적으로 백업하는 것은 디렉터리를 복사하는 것이 아닙니다.

백업할 스크립트에 다음 줄이 있는데 모든 디렉터리를 재귀적으로 복사하지 않고 파일을 가져오지만 모두 함께 묶습니다. 누구든지 무엇이 문제인지 말해 줄 수 있습니까?

find . -type f -not -executable -exec cp -ruv {} /run/media/user/32GB/prog/ \; 

답변1

find에 대한 인수 -exec는 반환된 각 항목에 대해 해당 명령을 실행합니다. 예를 들어 다음과 같은 디렉터리가 설정되어 있다고 가정해 보겠습니다.

>$ find .
.
./a.txt
./b.txt
./dir1
./dir1/c.txt 
./dir2
./dir2/d.txt

해당 -exec부분은 각 줄에 대해 한 번씩 실행되며 의 텍스트를 대체합니다 {}. 따라서 귀하의 경우 각 항목을 지정된 디렉토리에 재귀적으로 복사합니다.

cp -ruv a.txt /run/media/user/32GB/prog/
cp -ruv b.txt /run/media/user/32GB/prog/
cp -ruv dir1 /run/media/user/32GB/prog/
cp -ruv dir1/c.txt /run/media/user/32GB/prog/
etc, etc

덧붙여, 당신도 표시합니다 -not -executable. 이것이 진정한 차이를 만듭니다. Linux의 디렉터리는 실행 가능합니다. (디렉터리의 실행 비트는 폴더를 실행할 수 없기 때문에 디렉터리의 내용을 나열하는 권한을 관리합니다.)

>$ ls -l
-rw-rw-r--.   1 user user     1583 Feb 10 13:14 a.txt
-rw-rw-r--.   1 user user     1583 Feb 10 13:14 b.txt
drwxr-xr-x.   2 user user     4096 Nov 22  2013 dir1
drwxr-xr-x.   2 user user     4096 Nov 22  2013 dir2

그래서,

>$ find . -not -executable 
a.txt
b.txt
dir1/c.txt
dir2/d.txt

어떤 디렉터리도 반환하지 않고 실행 불가능한 파일 목록( -type f)만 반환합니다. 그리고 말했듯이 cp각각의 항목을 개별적으로 복사합니다(디렉토리만 재귀적으로 복사할 수 있으므로)./run/media/user/32GB/prog/

잠재적인 해결책은 먼저 모든 것을 복사한 다음 find/ 를 수행하는 것입니다.rm

>$ cp -ruv . /run/media/user/32GB/prog/
>$ find /run/media/user/32GB/prog -executable -type f -exec rm {} \;

또는 불쾌한 rsync(나는 사랑한다 rsync):

>$ find . -type f -not -executable > /tmp/filelist
>$ rsync -r --include-from=/tmp/filelist . /run/media/user/32GB/prog/

rsync는 현재 디렉토리를 재귀적으로 복사하여 지정된 파일(비실행 파일)만 추가합니다. 그러면 추가 쓰기/삭제가 방지됩니다.

관련 정보