如何在bash脚本中处理文件名中的空格?

时间:2013-12-09 20:27:11

标签: bash

我想自动化rsyncing,并尝试了以下代码:

TARGET="/media/USB\ DISK/Backup/"
rsync -av --delete ~/Data ${TARGET}

但执行会导致以下错误:

rsync: link_stat "/media/USB\" failed: No such file or directory (2)
rsync: mkdir "/home/DISK/BACKUP" failed: No such file or directory (2)

因为目标文件名中的“空格”。但是,当我echo命令我可以使用它直接在shell上运行。

如何正确地做到(哪个括号,反斜杠或没有?)以及为什么?

3 个答案:

答案 0 :(得分:10)

有两种可能性:

TARGET="/media/USB DISK/Backup/"
rsync -av --delete ~/Data "${TARGET}"

TARGET=/media/USB\ DISK/Backup/
rsync -av --delete ~/Data "${TARGET}"

第一个通过引用整个字符串来保留空间。第二个用反斜杠转义它来保留空间。此外,需要引用rsync命令的参数。

当字符串都是双引号且空格前面有反斜杠时,如TARGET="a\ b"中所示,结果是TARGET包含一个字面反斜杠,这可能不是你想要的。有关详细信息,请参阅man bash中标题为“引用”的部分。

答案 1 :(得分:0)

你应该在字符串周围使用引号。字符串应该在声明和使用/调用时引用

为什么要使用引号?

元字符[1]

  

引用的第一个功能是允许单词包含这些   元字符

单词拆分和通配[2]

  

引用的第二个目的是阻止word splitting和   通配

报价类型

有关详细信息,请阅读Types of quoting section

简单引号(POSIX)

  

单引号之间的所有内容都是 literal 并扩展为单个引号   字

双引号(POSIX)

  

允许shell 解析其内容以获取这些类型的扩展   带有$符号的前缀 - 参数扩展,算术   扩展和命令替换,同时处理所有其他内容   作为文字[...]

Bash引用$'…'$"…"

那些是非POSIX(由Bash,Ksh93等支持):

  • $'…':允许使用/展开反斜杠转义序列(\n\t等);
  • $"…":用于翻译

参考

答案 2 :(得分:0)

试试这个。我认为花括号(参数扩展)搞砸了。

TARGET="/media/USB DISK/Backup/"
rsync -av --delete ~/Data "$TARGET"