我的服务器上的一些文件由于断行而无意中保存了。它们file?name.txt
在查看服务器上的文件时显示。使用scp将这些文件传输到本地计算机不起作用,因为出现“无法写入文件”错误。导致此错误的问题已得到解决,但我无法访问这些文件。获取这些文件的最佳方法是什么?
换行符与Unix中文件名中的任何其他字符一样有效。对于shell,该字符具有特殊含义(它分隔命令),因此需要像其他任何特殊字符一样引号(例如空格;
,|
...)。
在类似Bourne的shell中,可以用单引号或双引号引起来:
ls -d 'a
b'
或者:
ls -d "a
b"
一些炮弹(ksh93
,zsh
,bash
,mksh
,FreeBSD的sh
至少)也支持:
ls -d $'a\nb'
对于scp
,请注意,文件名将传递到远程用户的登录shell。当您这样做时:
scp file user@host:something
最后调用用户的登录shellhost
来解释以下内容:
scp -t something
命令行(至少使用openssh)。因此,如果该外壳类似于Bourne,则必须为:
scp 'src/a
b' user@host:"dest/'a
b'"
如果您这样做:
scp 'a
b' user@host:dest/
或者
scp -r src user@host:dest/
服务器上的sshd运行:
scp -t dest/
或者
scp -r -t dest/
并且文件名不会在远程Shell命令行上传递,而是嵌入在客户端和服务器之间的数据流中scp
。但是,我发现(至少使用openssh 7.2p2)换行符最终转换为\^J
(3个字符)。
因此,您可能希望使用其他机制来ssh
更可靠地传输文件,例如rsync
或sftp
或tar
:
tar cf - src | gzip | ssh user@host 'cd dest && gunzip | tar xpf -'
保留硬链接,软链接和其他文件属性也会更好。如果文件名包含非ASCII字符,则可能还需要考虑字符集转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句