![scp 别名用于删除冒号/特殊字符](https://linux22.com/image/94057/scp%20%E5%88%AB%E5%90%8D%E7%94%A8%E4%BA%8E%E5%88%A0%E9%99%A4%E5%86%92%E5%8F%B7%2F%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6.png)
最近,Windows 10 添加了 bash shell,作为其 Linux Subsystems for Windows 计划的一部分。这通常很棒,但我遇到了一个有趣的问题:Windows 文件系统不允许在文件名中使用冒号/其他特殊字符。因此,当我尝试scp
这样的事情时:
scp user@remote:/path/to/file-2016-09-07_08:45:45.txt .
scp 抛出无效参数错误。解决这个问题的一种方法是指定一个不带特殊字符的新文件名,但是当尝试执行类似的操作时,这很麻烦
scp user@remote:/path/to/file-2016-09-07* .
因为所有文件都会抛出无效参数错误。_
例如,我可以在 .bashrc 文件中放置一些代码来接受任何 scp 参数并将每个有问题的字符替换为 吗?相当于
scp user@remote:/path/to/file-2016-09-07_08:45:45 file-2016-09-07_08_45_45.txt
但便携式可与*
?
答案1
您可以对名称进行参数替换——如果您将其放在变量中的话。但是 shell 不会“看到”远程文件系统上scp
可能“看到”的通配符扩展,因此 shell 别名不起作用。
根据描述,您可以编写一个脚本来执行您所要求的操作,例如,
- 用于
ssh
获取远程文件名列表,以及 - 循环中...
- 形成本地文件名,并且
- 使用 scp 复制实际的远程/本地文件。
答案2
您还可以考虑在原始文件名中使用替代 Unicode 字符,从而允许复制而不会出现任何命名问题。
- 对于冒号,请使用꞉ - 修饰符字母冒号: U+A789 - Unicode 字符表。
- 对于问号,请使用? - 全角问号: U+FF1F - Unicode 字符表。
- 对于星号,请使用⁎ - 低星号:U+204E - Unicode 字符表。