我想将 find 的输出通过管道传输到 scp 的输入列表中,怎么做?

我想将 find 的输出通过管道传输到 scp 的输入列表中,怎么做?

我是 Linux 新手,我想将一长串文件从一台计算机发送到另一台计算机。参数列表太长,所以我使用 find。但是我在设置表达式时遇到了麻烦。有人能帮忙吗?

这是我通常输入的简短参数列表。

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

我认为这可以转化为 find。

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

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

答案1

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= 参数。
  • 另一个选择是使用同步

答案2

只需一个命令即可完成此操作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命令封装在反引号 `而不是单引号

答案3

for f in `find . -name "*"`;do scp $f phogan@computer/directory;done

答案4

我会建议

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

请注意,此解决方案避免在命令行中出现文件名,因为它们可能会被解释为命令行参数。

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

相关内容