我想 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 的所有文件,因此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 存档内容。将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