Bash 如何获取使用scp-r下载的文件列表

Bash 如何获取使用scp-r下载的文件列表,bash,scp,Bash,Scp,是否可以使用scp-r获取下载的文件列表 例如: $ scp -r $USERNAME@HOSTNAME:~/backups/ . 3.tar 100% 5 0.0KB/s 00:00 2.tar 100% 5 0.0KB/s 00:00 1.tar 100% 4 0.0KB/s 00:00 预期结果: 3.tar 2.tar 1.tar scp生成的输出似乎不会出现在任何标准流(stdout或std

是否可以使用
scp-r
获取下载的文件列表

例如:

$ scp -r $USERNAME@HOSTNAME:~/backups/ .

3.tar    100%    5     0.0KB/s   00:00    
2.tar    100%    5     0.0KB/s   00:00    
1.tar    100%    4     0.0KB/s   00:00 
预期结果:

3.tar
2.tar
1.tar

scp
生成的输出似乎不会出现在任何标准流(stdout或stderr)上,因此直接捕获它可能很困难。一种方法是让
scp
输出详细信息(使用
-v
开关),然后捕获并处理该信息。详细信息在stderr上输出,因此您需要使用
2>
捕获它

例如,要捕获详细输出,请执行以下操作:

scp -rv $USERNAME@HOSTNAME:~/backups/ . 2> scp.output
然后,您将能够使用以下内容过滤此输出:

awk '/Sending file/ {print $NF}' scp.output

awk
命令只在相关行中打印最后一个单词。如果您的文件名中有空格,那么您可能需要想出一个更健壮的过滤器。

我知道您问了一个关于
scp
的问题,但我将为您提供另一种解决方案,使用ssh从服务器递归复制文件,并获取复制的文件名

scp
解决方案至少有一个问题:如果复制大量文件,每个文件生成一个事务需要一段时间。我使用的不是
scp
,而是
ssh
tar

ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tar -xf -
这样,添加一个
tee
和一个
tar-t
可以满足您的需要:

ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tee >(tar -xf -) | tar -tf - > file_list
请注意,它可能无法在所有shell中工作(bash是可以的),因为
>(…)
构造(进程替换)不是通用选项。如果您的shell中没有fifo,您可以使用fifo(基本上是流程替代允许的,但更短):

使用-v时,“发送文件模式:C0644 7864 a.sql”应输出到stderr


使用“awk”选择文件列表

尝试在
history
grep
之间使用组合。这将只列出从当前会话下载的文件。不幸的是,如果出现错误,这种方法也会忽略输出中的错误,从而将它们隐藏为任何自动过程的一部分。
mkfifo tmp4tar
(tar -xf tmp4tar ; rm tmp4tar;) &
ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tee -a tmp4tar | tar -tf - > file_list
scp -v -r yourdir orczhou@targethost:/home/orczhou/ \
2> >(awk '{if($0 ~ "Sending file modes:")print $6}')