【问题标题】:Copy File: Name Contains Spaces复制文件:名称包含空格
【发布时间】:2012-09-30 07:21:56
【问题描述】:

我有一个大型 shell 脚本来处理我的每个 Solaris 系统的文件。

脚本一开始创建了一个变量 FILENAME 有时人们会创建包含空格的目录/文件。 例如

/users/ldap/Anukriti's System Backup/BACKUP/workspace/BP8/scripts/yui/editor/simpleeditor.js

稍后在我运行的脚本中

cp $FILENAME $DESTDIR/

你可以想象这总是失败,因为以下是无效的。

cp /users/ldap/Anukriti's System Backup/BACKUP/workspace/BP8/scripts/yui/editor/simpleeditor.js $DESTDIR

我尝试将变量放在引号中,但这不起作用。我以前使用 find 和 -exec 选项,但在这种情况下,这并不是一个真正的选项,特别是因为 Solaris 不支持 -wholename 或 -path 选项

我可以在这里做什么?

【问题讨论】:

  • 请在调用副本之前添加echo cp "$FILENAME" "$DESTDIR",将cp行更改为cp "$FILENAME" "$DESTDIR"并发布输出
  • 来自echo cp "$FILENAME" "$DESTDIR" 的结果。 cp /users/ldap/Anukriti's System Backup/BACKUP/workspace/BP8/scripts/yui/editor/simpleeditor.js /mnt/nastmp/dev/oscar/
  • 由于某种原因,您拒绝发布错误消息,否则很难知道您做错了什么。
  • 给我们sh -x /path/to/bigscript的最后几行
  • @MiserableVariable cp: cannot stat Backup/BACKUP/workspace/BP8/scripts/yui/editor/simpleeditor.js: No such file or directory

标签: shell unix copy solaris


【解决方案1】:

你只需要用引号保护变量:

cp "$FILENAME" "$DESTDIR"

注意

不要使用单引号',变量不能这样展开。

【讨论】:

  • 您说“见上文”,但除了“这不起作用”之外没有提供任何其他信息。
  • OP 中的最后一行说我尝试将变量放在引号中。
【解决方案2】:

确保

  • $DESTDIR 存在
  • 是一个目录
  • 是的,对两个变量都使用双引号并去掉尾随的/

你可能不相信,但那是你的问题。 :-)

【讨论】:

  • 它确实存在,因为它每次都有效,源文件没有空格。
  • 对,处理空格的解决方案是使用双引号,仅此而已。如果这不能解决您的问题,那么您就没有告诉我们我们需要知道的一切。 cp 命令是大脚本中eval 的一部分吗?
  • 不,脚本的其余部分无关紧要。制作一个文件“我的文件”。然后将其设置为变量。 FILENAME="my file" 。然后运行echo cp $FILENAME /destdir/ ...输出为cp my file /destdir/ ..由于空格而无效...如果您运行cp my file /destdir/,则输出为cp: cannot stat file: No such file or directory ...好的,让我们添加引号cp "$FILENAME" /destdir/ .. . 相同的结果cp: cannot stat file: No such file or directory ...
【解决方案3】:

看起来我需要使用花括号进行变量扩展和双引号

cp "${FILENAME}" $DESTDIR

【讨论】:

  • 这不是真正的答案,也不是您的问题。在这种情况下,使用大括号没有任何区别。大括号仅在变量名称后跟字母数字字符时才重要,如echo "${FOO}BAR" vs echo $FOOBAR
  • 它有效,与其他答案相比,我只能说这些
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2022-12-22
  • 2023-04-01
  • 2011-02-02
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多