我的目标是使用scp仅将〜/ local_dir中的所有文件复制到user@host.com / var / www / html / target_dir中,而不在local_dir中创建local_dir类别。

/var/www/html/target_dir/files..


,但不是

使用-r参数时的/var/www/html/target_dir/local_dir/files..

评论

scp * user@host.com:/ var / www / html / target_dir是否不执行您想要的操作?如果是这样,请更详细地编辑您想要做的事情和到目前为止已经尝试过的事情。

追加/。不再工作。更多内容

#1 楼

scp具有-r参数。因此,请尝试使用:

$ scp -r ~/local_dir user@host.com:/var/www/html/target_dir


-r参数的工作方式与cp中的-r arg相同,它将传输整个文件夹以及其中的所有文件和子目录。

评论


您的命令在/ var / www / html / target_dir中创建了local_dir目录,我的目标是仅复制文件。

–埃德加拉斯·卡尔卡(Edgaras Karka)
15年9月30日在8:25

抱歉,我理解错了。然后,只需重复该命令即可,但是像这样:$ scp -r〜/ local_dir user@host.com:/ var / www / html /然后根据需要重命名新目录。

–瘫痪
2015年9月30日在8:31



或$ scp -r〜/ local_dir / * user@host.com:/ var / www / html / target_dir随便什么。

–瘫痪
2015年9月30日在8:34



将通配符*更改为点。并且您将复制目录内容(包括任何点文件),而无需复制目录本身。 scp -pr〜/ local_dir /。 user@example.com:/ path / to / target_dir

–roaima
17年7月21日在22:25

不幸的是,使用。已因实施不当的scp“错误修正”而被破坏(请参见
– rivy
20-6-28在21:15



#2 楼

如果您的目标是从local_dir传输所有文件,则*通配符可以解决问题:

$ scp ~/local_dir/* user@host.com:/var/www/html/target_dir


-r选项的意思是“递归”,因此,当重新尝试传输整个目录或几个目录。

man scp

-r 
Recursively copy entire directories. Note that scp follows symbolic links encountered in the tree traversal.


因此,如果您在local_dir内有子目录,则最后一个示例仅传输文件,但是如果设置-r选项,它将传输文件和目录。

评论


1+因为您需要阅读接受的答案中的注释才能获得正确的答案,而本答案仅作直接解释。

–安德烈·克里斯托弗·安徒生
17年7月5日在10:01

#3 楼

/.附加到源目录将传输其内容,而不是目录本身。与通配符解决方案相比,此解决方案还将包括所有隐藏文件。

$ scp -r ~/local_dir/. user@host.com:/var/www/html/target_dir


该解决方案的信用归roaima所有,但我认为应该将其发布为实际文件。答案,不仅是评论。

评论


不幸的是,此解决方案已被实施不当的scp“ bugfix”破坏(请参见
– rivy
20年6月28日在21:14

#4 楼

请执行以下步骤:



复制目录local_dir及其所有子目录:

scp -r ~/local_dir user@host.com /var/www/html/target_dir



仅复制local_dir的内容,而不复制目录local_dir本身:

scp -r ~/local_dir/* user@host.com /var/www/html/target_dir



请勿使用:scp -r ~/local_dir/. user@host.com /var/www/html/target_dir会引发错误(仅经过测试并收到以下错误):

scp: error: unexpected filename: .




评论


我也收到意外的文件名错误。但是,使用通配符也不起作用,这是因为目录中包含的文件太多,导致扩展通配符时超出了命令的字符数限制。苹果系统

–理查德·基弗(Richard Kiefer)
20年1月8日在10:17

@RichardKiefer:您可以使用通配符吗?用*进一步隔离搜索结果,然后将其传递给scp。试试此链接,可能会有所帮助:通配符

–赛拉德·法拉兹·乌玛(Syed Faraz Umar)
20年1月14日在6:15

谢谢Syed,但我的意思是我实际上想定位文件夹中的所有元素,而不过滤任何元素。而且如果我的目录太多,则通配符将不起作用。

–理查德·基弗(Richard Kiefer)
20年1月14日在8:33

@RichardKiefer:我很抱歉,Richard,要复制所有文件,我们可以使用一个小的bash脚本。用途:ls -l | awk'{print $ 9}'并将所有输出(将是所有文件名)重定向到txt文件。一次读取一行txt文件,并将该输入与scp一起使用来复制文件:input = / home / user / filename.txt,而IFS = read -r行

–赛拉德·法拉兹·乌玛(Syed Faraz Umar)
20 Jan 14'9:59