Como scp todos os arquivos de um determinado proprietário?

1

Eu quero scp todos os arquivos de certos proprietários. Por exemplo, se esta for minha ls -la output:

-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

Eu gostaria de scp todos os arquivos do proprietário 1 e 3, então file1 , file4 e file5 .

Existe algo como

scp [email protected]:/path/to/folder/* . --owner owner1 owner2
    
por Niek de Klein 02.06.2015 / 17:19

3 respostas

4

A maneira mais eficiente e segura provavelmente é find | tar | tar :

ssh [email protected] 'cd /path/to/folder; find . \( -user owner1 -o -user owner3 \) -print0 | tar --null -T - -cf -' | tar -xvf -

É melhor revisar o conteúdo do arquivo tar antes de extraí-lo. Substitua a última | tar -xvf - para | tar -tvf - e execute para obter a lista de arquivos.

    
por 02.06.2015 / 20:16
2

Não tenho certeza se existe um comando / método mais curto para isso, mas isso funcionará:

for i in * ; do [[ $(stat -c %U ./"$i") =~ owner1|owner3 ]] && scp -p [email protected]:/path/to/folder/ ./"$i"  ; done

Ele usa o stat -c %U em todos os arquivos no diretório atual para verificar seus proprietários e continua com scp do arquivo se o proprietário for owner1 ou owner3.

    
por 02.06.2015 / 18:45
0

Se o servidor remoto suportar SFTP e o cliente permitir FUSE , monte o diretório remoto sobre SSHFS . Você pode então trabalhar sem ter que se preocupar com arquivos locais versus remotos: todos serão arquivos.

mkdir ~/mnt
sshfs [email protected]:/path/to/folder ~/mnt

Agora, você precisa copiar os arquivos de propriedade de determinados usuários para o diretório ~/mnt . Para fazer isso para todos os arquivos no diretório atual (mas não em subdiretórios):

find . -name . -o -type d -prune -o \( -user owner1 -o owner3 \) -exec cp -p {} ~/mnt \;

Para percorrer o diretório atual recursivamente e colocar todos os arquivos no diretório de destino, perguntando se há colisões de nome:

find . \( -user owner1 -o owner3 \) -exec cp -ip {} ~/mnt \;

Para percorrer o diretório atual recursivamente e reproduzir a árvore de diretórios do outro lado, você pode usar um dos seguintes:

find . \( -user owner1 -o owner3 \) -print0 | cpio -p0 ~/mnt
find . \( -user owner1 -o owner3 \) -exec pax -rw -pe {} ~/mnt \;

É mais simples se você tiver zsh, porque pode selecionar arquivos por proprietário com um qualificador glob .

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

Quando terminar de trabalhar com os arquivos remotos, desmonte o sistema de arquivos.

fusermount -u '/mnt
rmdir ~/mnt
    
por 04.06.2015 / 01:56

Tags