我遇到的问题是,我们的服务器在嵌套目录中有一堆文件,我试图找到这些文件并将其复制到我的主目录上的文件夹中。这意味着我不能像这样简单地遍历所有文件:
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
不会遍历它们,这意味着它不会在子目录下找到您感兴趣的文件。