백업할 스크립트에 다음 줄이 있는데 모든 디렉터리를 재귀적으로 복사하지 않고 파일을 가져오지만 모두 함께 묶습니다. 누구든지 무엇이 문제인지 말해 줄 수 있습니까?
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는 현재 디렉토리를 재귀적으로 복사하여 지정된 파일(비실행 파일)만 추가합니다. 그러면 추가 쓰기/삭제가 방지됩니다.