如何 scp 某个所有者的所有文件?

如何 scp 某个所有者的所有文件?

我想 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

我想 scp 所有者 1 和 3 的所有文件,因此file1file4file5

有没有类似的东西

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 存档内容。将last 替换| 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

相关内容