【问题标题】:Can't use folder path with tilde in rmdir无法在 rmdir 中使用带有波浪号的文件夹路径
【发布时间】:2017-05-10 19:42:07
【问题描述】:

我需要能够删除与任何用户系统的 Documents 文件夹相关的目录。

rmdir: ~/Documents/Folder: No such file or directory

如果我手动输入扩展路径(/Users/ricky/Documents/Folder),它可以正常工作。

我认为 bash 会自动扩展路径开头的波浪号吗?

更新:

按照建议尝试了一堆不同的方法后,我现在非常有信心,问题在于我如何存储路径。我从逐行读取的文本文件中获取路径:

...
export_folder_path="$(echo $line | cut -f2 -d=)"
...

echo $export_folder_path
rmdir $export_folder_path
rmdir "$HOME/Documents/Folder\ 1"

这会输出以下内容:

$HOME/Documents/Folder\ 1
rmdir: $HOME/Documents/Folder\ 1: No such file or directory
rmdir: /Users/ricky/Documents/Folder\ 1: Directory not empty (This is actually what I want)

我无法弄清楚手动输入导出路径和使用变量之间的区别。为什么变量拒绝扩展$HOME?我尝试了许多添加引号的变体,但都没有成功。

【问题讨论】:

  • realpath -m ~/Documents/Folder 输出什么?
  • @sschuberth 我好像没有一个叫 realpath 的程序?
  • 你在跑什么?从路径来看,您似乎是在 Windows 下运行 Bash。如果是这样,什么 Bash?赛格温? MSYS(2)?用于 Windows 的 Git? Windows 10 下的 Linux 子系统?
  • @sschuberth 我使用的是 macOS 10.12.2
  • 如果字符串在单引号或双引号中,bash 不会扩展 ~

标签: bash macos path filenames tilde-expansion


【解决方案1】:

波浪号扩展并非在所有情况下都有效。您可以改用 HOME 变量:

rmdir $HOME/Documents/Folder

来自bash manual

波浪号扩展如果单词以未引用的波浪号字符开头 ('~'),第一个不带引号的斜杠之前的所有字符(或 所有字符,如果没有不带引号的斜杠)被视为 波浪号前缀。如果波浪号前缀中的所有字符都不是 带引号的,波浪号后面的波浪号前缀中的字符是 被视为可能的登录名。如果此登录名为空 字符串,波浪号替换为 shell 参数的值 家。如果 HOME 未设置,则执行用户的主目录 shell 被替换。否则,波浪号前缀为 替换为与指定登录关联的主目录 名字。

如果波浪号前缀是 '~+',则 shell 变量 PWD 的值 替换波浪号前缀。如果波浪号前缀是 '~-',则值 如果设置了 shell 变量 OLDPWD,则替换它。如果 波浪号前缀中波浪号后面的字符由 数字 N,可选前缀为“+”或“-”,波浪号前缀为 替换为目录 st 中的相应元素,因为它 将由使用波浪号前缀调用的内置 dirs 显示 作为论据。如果在波浪号后面的字符 波浪号前缀由没有前导“+”或“-”的数字组成,“+”是 假设。

如果登录名无效,或者波浪号扩展失败,单词 没有改变。

【讨论】:

  • 感谢@usr,我已经更新了我的问题,添加了一些关于为什么它仍然不起作用的更多细节。
  • 太棒了。 $HOME 在这种情况下完美地替代了 ~ 的需要。谢谢
猜你喜欢
  • 2014-11-25
  • 2011-03-05
  • 2020-11-29
  • 2011-03-30
  • 2018-12-20
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多