是否可以获取使用下载的文件列表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
and 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
scp -v -r yourdir orczhou@targethost:/home/orczhou/ \
2> >(awk '{if($0 ~ "Sending file modes:")print $6}')
使用 -v "发送文件模式:C0644 7864 a.sql" 应该输出到 stderr
使用 'awk' 选择文件列表