如何远程查找和复制文件而不出现权限错误或无需多次登录?

如何远程查找和复制文件而不出现权限错误或无需多次登录?

我遇到的问题是,我们的服务器在嵌套目录中有一堆文件,我试图找到这些文件并将其复制到我的主目录上的文件夹中。这意味着我不能像这样简单地遍历所有文件:

scp user@server:"$find_directory/*.genes.results" $copy_directory

所以我尝试用while循环解决这个问题,并且文件成功复制! 除了这是非常不切实际的,因为它每次循环时都要求我登录服务器:

#!/bin/bash

#read in starting and ending directory
read -p "Directory that contains all files to move from server: " find_directory
read -p "Directory that will contain all files from server: " copy_directory

path_list=""
ssh user@server find "$find_directory" -name "*.genes.results" | 
while read path_name
do
    echo "$path_name"
    scp user@server:$path_name "$copy_directory"
done

所以我想我会很聪明,用一个优雅的小命令替换来解决这个问题......

scp user@server:"$( ssh gordid@cadillac find "$find_directory" -name "*.genes.results" )" $copy_directory 

它找到了所有文件...除了它们都没有被复制,因为我遇到了一些奇怪的权限错误!这是没有意义的,因为我在这个 scp 的两端都拥有所有必要的权限(而且它之前也与 while 循环一起工作过)。

权限拒绝错误列表

所以现在我已经没有想法了。我可以返回循环并设置自动登录,但我觉得此时我过于复杂了。 StackExchange,你有什么想法?

编辑:找到这个资源这似乎有同样的问题。也许自动登录是唯一的选择?

答案1

假设可以在本地目录上保留目录结构,那么您可以通过tar在远程端创建 tarball、通过 SSH 连接进行流式传输然后tar在本地使用解压来解决此问题。

例如:

$ ssh user@server "
      cd '$find_directory' &&
      find . -name '*.genes.results' |
      tar -cf - -T -
  ' | tar -C "$copy_directory" -xvf -

也可以使用rsync包含/排除列表来仅复制具有所需扩展名的文件。rsync默认情况下将使用 SSH。它还将保留远程服务器的目录结构。

$ rsync -av --delete \
      --include '*/' \
      --include '*.genes.results' \
      --exclude '*' \
      --prune-empty-dirs \
      user@server:"$find_directory/" \
      "$copy_directory/"

这些rsync选项将复制带有扩展名的目录和文件.genes.results,然后排除其他所有内容。它将在复制后修剪留空的目录。首先包含目录是必要的,因为否则rsync不会遍历它们,这意味着它不会在子目录下找到您感兴趣的文件。

相关内容