![当文件存在时,scp“没有这样的文件”?](https://linux22.com/image/1499595/%E5%BD%93%E6%96%87%E4%BB%B6%E5%AD%98%E5%9C%A8%E6%97%B6%EF%BC%8Cscp%E2%80%9C%E6%B2%A1%E6%9C%89%E8%BF%99%E6%A0%B7%E7%9A%84%E6%96%87%E4%BB%B6%E2%80%9D%EF%BC%9F.png)
我正在尝试将文件夹从本地计算机复制到远程服务器,但似乎只能捕获文件夹中一半的文件。这是我的 scp 命令:
scp read_tree [email protected]:~/Work/gmovie
这是我得到的输出:
.DS_Store 100% 6148 6.0KB/s 00:00
read_tree/check_syscalls.c: No such file or directory
read_tree/check_syscalls.h: No such file or directory
example.c 100% 204 0.2KB/s 00:00
Makefile 100% 438 0.4KB/s 00:00
read_tree.c 100% 9350 9.1KB/s 00:00
read_tree.h 100% 1176 1.2KB/s 00:00
read_tree/stringparse.c: No such file or directory
read_tree/stringparse.h: No such file or directory
read_tree/strtonum.c: No such file or directory
zacc.c 100% 885 0.9KB/s 00:00
我也尝试直接对一个文件使用 scp,结果相同。您知道我哪里做错了吗?
**我正在我的 Mac 终端上工作
**编辑:ls -al 用于 read_tree 目录:
total 112
drwxr-xr-x@ 13 name staff 442 Jul 11 10:42 .
drwx------+ 109 name staff 3706 Jul 11 10:42 ..
-rw-r--r--@ 1 name staff 6148 Jul 11 11:16 .DS_Store
-rw-r--r--@ 1 name staff 438 Jul 11 09:58 Makefile
lrwxr-xr-x@ 1 name staff 23 Jul 11 09:58 check_syscalls.c -> ../src/check_syscalls.c
lrwxr-xr-x@ 1 name staff 23 Jul 11 09:58 check_syscalls.h -> ../src/check_syscalls.h
-rw-r--r--@ 1 name staff 204 Jul 11 09:58 example.c
-rw-r--r--@ 1 name staff 9350 Jul 11 09:58 read_tree.c
-rw-r--r--@ 1 name staff 1176 Jul 11 09:58 read_tree.h
lrwxr-xr-x@ 1 name staff 20 Jul 11 09:58 stringparse.c -> ../src/stringparse.c
lrwxr-xr-x@ 1 name staff 20 Jul 11 09:58 stringparse.h -> ../src/stringparse.h
lrwxr-xr-x@ 1 name staff 17 Jul 11 09:58 strtonum.c -> ../src/strtonum.c
-rw-r--r--@ 1 name staff 885 Jul 11 09:58 zacc.c
答案1
看起来 Mac 上的 scp 不遵循符号链接,并且您的符号链接文件是导致问题的原因。
许多可能的选择中的两个是:
0. 使用-r
scp 选项(手册页说它遵循符号链接)。1
. 将文件打包成一个包,然后通过 scp 发送这个单个文件。2
. 复制文件夹(取消引用符号链接)并将这个新文件夹 scp 起来。
0)递归 SCP 选项
scp 的手册页内容如下:
-r Recursively copy entire directories. Note that scp follows symbolic links encountered in the tree traversal.
因此,我期望以下措施能够发挥作用:
scp -r read_tree <destination>
(但是,我还没有在 Mac 上测试过,但它确实可以在 GNU/Linux 系统上运行。)
1)Tarball 选项
使用 打包文件夹tar -h
,然后发送一个生成的文件。
tar czhf read_tree.tgz read_tree
scp read_tree.tgz <destination>
现在,您可以通过 ssh 进入远程服务器并解压文件:
ssh <destination>
cd ~/Work/gmovie
tar xvf read_tree.tgz
2)复制文件夹取消引用符号链接
复制原始文件夹,但要确保取消引用符号链接以复制原始文件。这可以使用以下方法实现cp -L
:
cp -rLf read_tree read_tree_nosymlinks
现在 scp 新文件夹:
scp -r read_tree_nosymlinks <destination>