我是 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 循环可能难以处理文件名列表。