我想将find的输出传递到scp的输入列表中,怎么办?


10

我是Linux新手,我正尝试从一台计算机向另一台计算机发送一长串文件。参数列表太长,因此我正在使用find。我在设置表达式时遇到了麻烦。有人可以帮忙吗?

这是我通常会为简短参数列表键入的内容。

scp ./* phogan@computer/directory...

我认为这可能会转化为find。

scp find . -name "*" phogan@computer/directory...

也许我可以使用管道系统?任何建议都会有所帮助。提前致谢。

Answers:


16
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

通常,我会将所有文件“ tar”在一起成为一个巨大的blob,然后只调用“ scp”一次。像这样:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • 可以使用tar的--exclude =或--include =参数。
  • 另一种选择是使用rsync

如果在ssh / scp中使用密码,find的解决方案是否会在每个文件中都要求输入密码?
09年

让我们假设他知道如何使用ssh-keys :) 1000个密码问题的问题也是tar方法的原因
akira

15

您只需要一个命令就可以做到scp

  • 适用于以下更新版本scp
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • 对于旧版本:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

确保封装find中之间的命令反引号 `而不是单引号'


哪个scp版本,哪个linux发行版?例如,Ubuntu 14.04中的scp没有此选项。
geekQ

2
嗨,较早的版本支持它,新版本支持一个更简单的命令:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues

1
在多个文件不起作用
Amruta

@Amruta使用-r
slybloty

@slybloty scp -r用于递归单个(目录)条目,而不是多个条目(多个文件)。
AndrewF


1

我会建议

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

请注意,此解决方案避免在命令行中使用文件名,而将文件名解释为命令行参数。

要注意的另一件事是文件名可能包含空格。这意味着bash中的for循环可能难以处理文件名列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.