특정 소유자의 모든 파일을 scp하고 싶습니다. 예를 들어, 이것이 내 출력이라면 ls -la
:
-rw-rw-r-- 1 owner1 ad 704 Jun 1 18:16 file1
-rw-rw-r-- 1 owner2 ad 798 May 29 11:15 file2
-rw-rw-r-- 1 owner2 ad 881 May 29 09:28 file3
-rw-rw-r-- 1 owner3 ad 936 May 29 09:28 file4
-rw-rw-r-- 1 owner1 ad 1012 Jun 1 15:14 file5
소유자 1과 3이 있는 모든 파일을 scp하고 싶으므로 file1
, file4
및 file5
.
비슷한 게 있나요
scp [email protected]:/path/to/folder/* . --owner owner1 owner2
답변1
가장 효율적이고 안전한 방법은 아마도 다음과 같습니다 find | tar | tar
.
ssh [email protected] 'cd /path/to/folder; find . \( -user owner1 -o -user owner3 \) -print0 | tar --null -T - -cf -' | tar -xvf -
tar 아카이브를 추출하기 전에 tar 아카이브의 내용을 살펴보는 것이 좋습니다. 마지막을 다음 | tar -xvf -
으로 바꾸고 | tar -tvf -
실행하여 파일 목록을 가져옵니다.
답변2
이 작업을 수행하는 더 짧은 명령/방법이 있는지 확실하지 않지만 다음과 같이 작동합니다.
for i in * ; do [[ $(stat -c %U ./"$i") =~ owner1|owner3 ]] && scp -p [email protected]:/path/to/folder/ ./"$i" ; done
stat -c %U
현재 디렉터리의 모든 파일을 사용하여 소유자를 확인하고 scp
소유자가 소유자 1 또는 소유자 3이면 파일 처리를 계속합니다.
답변3
원격 서버가 SFTP를 지원하고 클라이언트가 이를 허용하는 경우퓨즈을 누른 다음 원격 디렉터리를 마운트합니다.SSHFS. 그러면 로컬 파일과 원격 파일에 대해 걱정하지 않고 작업할 수 있습니다. 둘 다 파일입니다.
mkdir ~/mnt
sshfs [email protected]:/path/to/folder ~/mnt
이제 일부 사용자가 소유한 파일을 이 디렉터리에 복사해야 합니다 ~/mnt
. 현재 디렉터리의 모든 파일에 대해 이 작업을 수행하려면(하위 디렉터리의 파일은 제외):
find . -name . -o -type d -prune -o \( -user owner1 -o owner3 \) -exec cp -p {} ~/mnt \;
현재 디렉터리를 재귀적으로 탐색하여 모든 파일을 대상 디렉터리에 넣습니다. 이름 충돌이 있으면 다음 메시지가 표시됩니다.
find . \( -user owner1 -o owner3 \) -exec cp -ip {} ~/mnt \;
현재 디렉터리를 재귀적으로 탐색하고 반대쪽에 디렉터리 트리를 재현하려면 다음 중 하나를 사용할 수 있습니다.
find . \( -user owner1 -o owner3 \) -print0 | cpio -p0 ~/mnt
find . \( -user owner1 -o owner3 \) -exec pax -rw -pe {} ~/mnt \;
zsh가 있으면 zsh를 사용하여 소유자별로 파일을 선택할 수 있으므로 훨씬 더 간단합니다.글로벌 예선.
cp -p -- *(uowner1,uowner3) ~/mnt # not recursive
cp -ip -- **/*(uowner1,uowner3) ~/mnt # recursive, flattened
zmv -C -Q -o-p '**/*(uowner1,uowner3)' '~/mnt/$f' # reproduce tree
원격 파일 작업이 끝나면 파일 시스템을 마운트 해제합니다.
fusermount -u `/mnt
rmdir ~/mnt