【问题标题】:How to remove directory name with special characters and directories with env variable name on UNIX如何在 UNIX 上删除带有特殊字符的目录名称和带有 env 变量名称的目录
【发布时间】:2012-06-14 06:08:12
【问题描述】:

我在此存储库中进行了搜索,但没有找到任何类似的问题,或者可能是我的搜索不正确。

我在我的客户环境中遇到了这个问题,一个自定义应用程序正在创建具有环境变量“$SRCDIR”和“$HOME”的目录以及创建这些目录的目录,它本身就是 HOME 目录路径。如果我说rm -rf $HOME,那么当前目录 $HOME 下的所有文件和子目录都将被删除。如何删除这些不需要的目录。

-rw-r--r--  1 grp domain users 418051450 Apr 18 18:09 $SRCDIR
-rw-r--r--  1 grp domain users 418051450 Apr 18 18:09 $HOME

还有一些目录是垃圾字符,如下例所示。

-rwxr-xr-x  1 grp domain users  0 Feb  7  2106 ??????w?O???*????_6??t??Ó¡?>?tP??Ñ?|?C

如何删除它们?

【问题讨论】:

    标签: linux unix special-characters


    【解决方案1】:

    对于垃圾名称,最简单的方法是构造一个只能捕获它们的通配符。选择名称的 可读 部分(例如 _6 子字符串)并将其包裹在星号中。先试试看:

    ls *_6*
    

    如果它列出垃圾名称,继续删除它:

    rm *_6*
    

    如果它还列出了其他名称,请尝试使通配符更具体,在名称中使用其他可读字符:

    ls *w*_6*tP*N*x*
    

    继续直到找到只匹配不需要的文件的通配符。

    【讨论】:

    • @dicaprio 如果您觉得满意,请随时接受答案。
    • @lazz,我可以接受你的 cmets 作为答案,但这部分解决了。第一个也是最重要的问题是如何删除带有 '$HOME' 的目录。 $HOME 是一个环境变量,它指向具有许多子目录的目录。
    • 你已经得到了@PavanManjunath 的回答。我不会把他的答案复制到我的。随意接受我或他的回答。
    • @dicaprio 以何种方式不能解决您的问题? rm 抛出什么错误?
    • 我有一个名为 -P 的空文件,rmdir \-Prmdir *P 都不起作用。最后,rmdir -- -P 成功了。 -- 告诉 rmdir 将以下 -P 视为普通文件名。
    【解决方案2】:

    确定必要文件/文件夹的 inode 数量:

    # ls -ila 
    14549980 drwxr-xr-x  3 root root       4096 Mar  5 20:45 ">?<
    

    并将其传送到rm:

    find . -inum 14549980  -exec rm -ir {} \;
    

    【讨论】:

    • 这是迄今为止最好的答案:与公认的答案相反,它不假定垃圾文件夹中有任何可读/可写字符!加上答案使用-i 开关进行交互式删除:这比接受的答案建议的裸露的rm 要好得多。一个完美的单线!
    【解决方案3】:

    如果你创建一个像 --rw-r-r-- 这样的目录。要删除此文件,请执行以下操作 rm -rf ./--rw-r-r--

    【讨论】:

    • UNIX 命令 rm(1) 将考虑“--”之后的所有内容而不是选项。因此,您还可以通过发出以下命令删除该目录: rm -fr -- --rw-r-r--
    • 这是一个比通配符更好的答案。
    【解决方案4】:

    在 linux 中尝试 zsh shell

    [root@rhel5-8 ~]# zsh
    [root@rhel5-8]~
    

    然后使用制表符完成来删除该目录。

    或者如果使用 bash

    [root@rhel5-8 ~]# cd "??????w?O???*????_6??t??Ó¡?>?tP??Ñ?|?C???????>?̤-???y?X???N?x??H?????Ч)?n?5‌​??{@?~]?" 
    

    进入那个目录

    【讨论】:

    • 这部分已经完成。如何删除名称如 $HOME 的目录。
    • 这很好用。我找到了一个名为 ? Bash 不会删除它,但 zsh 会删除它
    【解决方案5】:

    只需转义美元符号。试试这样-

    rm -rf \$HOME
    

    甚至? 符号也是如此。

    【讨论】:

    • 我试过`rm \?`,这就是它所说的。 rm: cannot remove ?':没有这样的文件或目录`。
    • ls -al 是否将? 显示为文件?通过错误,我可以看到 rm 确实将 ? 识别为文件但无法找到它。
    • 这是我看到的文件名,??????w?O???*????_6??t??Ó¡?&gt;?tP??Ñ?|?C?????(??&gt;?̤-???y?X???N?x??H?????Ч)?n?5??{@?~]??Z??o??????*
    • :) 不幸的是,您需要转义所有特殊字符。不仅仅是第一个?。如果您的 shell 支持制表符补全,那么您就可以免去繁重的工作!
    • 我怀疑问号实际上是终端编码中无法显示的字符,而不是实际的问号。
    【解决方案6】:

    您可以尝试 rm -rf '$HOME' '$SRCDIR' ,因为单引号会阻止 shell 变量的扩展。尝试使用 bash 和 ksh。

    【讨论】:

      【解决方案7】:

      您可以使用 c 程序来避免 shell/转义问题。查看this question的答案。

      【讨论】:

      • 我认为这不会有帮助。
      • 我浏览了所有的答案,在这种情况下 $PINHOME 目录不会扩展吗?
      • 它不应该,例如当我这样做时:os.listdir('$USER') 它会尝试查找名为'$USER'的文件夹。因此,在您的情况下,很容易执行以下操作: import shutil shutil.rmtree('/folder_name')
      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2016-02-04
      • 1970-01-01
      • 2012-12-11
      • 2014-07-16
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      相关资源
      最近更新 更多