3

是否可以获取使用下载的文件列表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
4

3 回答 3

2

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

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

scp -rv $USERNAME@HOSTNAME:~/backups/ . 2> scp.output

然后,您将能够使用以下内容过滤此输出:

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

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

于 2012-12-06T11:30:29.917 回答
1

我知道你问了关于 的问题scp,但我会给你一个替代解决方案来解决这个问题使用 ssh 从服务器递归复制文件,并获取复制的文件名

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

ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tar -xf -

这样,添加 atee和 atar -t即可满足您的需求:

ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tee >(tar -xf -) | tar -tf - > file_list

请注意,它可能不适用于所有 shell(bash 可以),因为>(...)构造(进程替换)不是一般选项。如果你的 shell 中没有它,你可以使用 fifo(基本上是进程替换允许的,但更短):

mkfifo tmp4tar
(tar -xf tmp4tar ; rm tmp4tar;) &
ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tee -a tmp4tar | tar -tf - > file_list
于 2012-12-06T16:11:24.007 回答
0
scp -v -r yourdir orczhou@targethost:/home/orczhou/ \
2> >(awk '{if($0 ~ "Sending file modes:")print $6}')

使用 -v "发送文件模式:C0644 7864 a.sql" 应该输出到 stderr

使用 'awk' 选择文件列表

于 2013-10-16T03:23:40.423 回答