【问题标题】:How to rm directory which name has quotation and question marks on macOS如何在 macOS 上 rm 名称带有引号和问号的目录
【发布时间】:2018-07-23 03:47:24
【问题描述】:

我有两个目录,名字很奇怪,如下:

"?????+ "BizComponent               
"?+ "BizComponent

现在我尝试删除它们但失败了。当我输入rm -r ' 然后输入tab 它给我:

"^J^I^I^I^I+ "BizComponent/BizComponent/        
"^J+ "BizComponent/


然后,当我输入rm -r "^J^I^I^I^I+ "BizComponent/BizComponent/ 时,它给了我没有这样的文件或目录

【问题讨论】:

  • 为什么不直接删除已完成的文件名?
  • rm -r "^J^I^I^I^I+ "BizComponent/BizComponent/ 会将双引号视为 shell 引用,并且命令将在没有引号的情况下执行。如果引用是名称的一部分,则需要通过转义或附加引用来保留引用。使用 glob 是最简单的:rm -r *BizComponent*.
  • @Amadan 我有另一个法线方向,其名称包含 BizComponent 。然后我可以重命名它们 rm -r *BizComponent* 但我想知道是否存在更直接的解决方案。

标签: shell rm


【解决方案1】:

问题是您的文件名包含一个特殊字符,但这不一定是您看到的字符。示例(取自here):

$ touch zzz yyy $'zzz\nyyy'
$ ls
yyy  zzz  zzz?yyy

如您所见,创建了一个带有新行的文件名,但ls 将其打印为?。那么我们如何移除它呢?

方法一: ls 可用的选项是 --quoting-style=shell-escape,这允许您查看如何键入要删除的文件名(适用于文件和目录):

$ ls --quoting-style=shell-escape
yyy   zzz  'zzz'$'\n''yyy'
$ rm 'zzz'$'\n''yyy'
$ ls
yyy   zzz

方法2:第二种方法是使用inode number,使用find(适用于文件和目录):

$ touch zzz yyy $'zzz\nyyy'
$ ls -li
total 2
3886009 -rw-r--r-- 1 user group 0 Jul 23 12:56 yyy
3886008 -rw-r--r-- 1 user group 0 Jul 23 12:56 zzz
 662083 -rw-r--r-- 1 user group 0 Jul 23 12:56 zzz?yyy
$ find . -inum 662083 -delete      
$ ls -li
total 1
3886009 -rw-r--r-- 1 user group 0 Jul 23 12:56 yyy
3886008 -rw-r--r-- 1 user group 0 Jul 23 12:56 zzz

【讨论】:

  • 第一种方法很酷,但是我的mac shell好像不支持。它告诉我ls: illegal option -- - usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...],第二种方法奏效了。
  • 你可以安装 GNU ls。 brew install coreutils 然后将其粘贴到您的 .bash_profile: alias ls='/usr/local/bin/gls --color=auto' (这将使第一种方法也起作用)。奖励:Mac 的 ls 仅限于 16 种颜色,GNU ls 更漂亮。
【解决方案2】:

看起来您的目录名称中有一些特殊字符。您可以使用带有 glob 的循环:

for dir in *BizComponent; do
  rm -r -- "$dir"
done

【讨论】:

    【解决方案3】:

    由于 shell 扩展,您需要转义特殊字符 ? + " ^space。因此,要引用您的文件,您需要像这样删除/引用它们:

    rm -rf \"\?\?\?\?\?+\ \"BizComponent/

    rm -rf \"\?\+\ \"BizComponent

    rm -rf \"\^J\^I\^I\^I\^I+\ \"BizComponent/BizComponent/

    等等。

    【讨论】:

      【解决方案4】:

      你为什么不试试rm -rf "?????+ BizComponent" | echo $?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-03
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多