【问题标题】:What does the bash command "rm *~" do?bash 命令“rm *~”有什么作用?
【发布时间】:2011-06-02 03:35:34
【问题描述】:

bash 命令rm *~ 只是删除以波浪号结尾的文件还是这里有更高级的 bash 或 gnu make 模式?谷歌似乎无法搜索这两个符号组合。我在 Makefile clean: 目标中找到了这个。

gnu 是否会仅使用隐式规则创建带有尾随 ~ 的文件?

【问题讨论】:

  • 人们通常建议你“试试看”。但我想使用rm 命令并不总是一个好的计划。
  • 测试 rm 的一个好的经验法则是将 rm 更改为 ls。它列出的文件是 rm 将删除的文件

标签: bash syntax gnu-make


【解决方案1】:

~(波浪号)字符在两种情况下在路径中具有特殊含义:

~user        # the home directory of user
~/folder     # folder inside your home directory

在大多数情况下,就是这样。您引用的命令与它看起来完全一样:删除名称以波浪号结尾的文件。诸如 emacs 之类的文本编辑器以波形符结尾的文件名保存文件的备份副本。

因此,此命令可能用于从当前目录(但不是子目录)中删除这些备份副本。想要这样做的一个原因是,如果将目录复制到 Web 服务器,因为服务器端代码(例如 PHP 文件)可能包含密码等敏感信息。

【讨论】:

  • 另外,'~-' 在某些 shell 中等价于 $OLDPWD(或特定 shell 等价于最后一个目录),为了完整起见,没有附加用户名的 '~' 扩展为 $HOME
  • 请确保不要引入额外的空格,如rm * ~
【解决方案2】:

如您所料,rm *~ 只是删除名称以波浪号 (~) 结尾的文件。以波浪号结尾的文件名通常是由编辑器创建的备份文件(特别是,emacs 是使用此约定的早期编辑器之一)。编辑源代码后,通常会留下许多此类文件。这就是 Makefile 中的 clean 目标删除这些的原因。

*~ 是否是一些特殊的 bash 模式与大多数 makefile 无关,因为 /bin/sh 默认用于执行 make 配方。只有在 makefile 中设置了 SHELL 时,才会使用不同的 shell。

查看 make 隐式规则的一种简单方法是在没有 makefile 的目录中运行 make -p。你会得到一个错误,说没有指定目标,但是 make 也会打印出它正在使用的隐式规则。如果您将此输出 grep 为波浪号,您将看到没有使用它命名文件的隐式规则。

【讨论】:

    【解决方案3】:

    不,就是你说的。删除以~ 结尾的文件。

    编辑 -> ~ 字符可能具有的唯一特殊含义是当前用户主目录的简写(如 $HOME),但仅限于路径的开头。

    【讨论】:

      【解决方案4】:

      我已使用该命令删除以“~”结尾的文件。我认为没有与波浪号相关的特殊转义字符。

      【讨论】:

        【解决方案5】:

        两者都同意


        实际上,你的两种可能性都有些真实。

        没有与~ 关联的通配符或特殊文件名语法,除非它出现在单词的开头。

        但以波浪号结尾的文件名模式由大多数Linux发行版上的mv(1)cp(1)程序自动生成的1如果-b (backup) 选项被指定并且目标文件存在。此类系统上的 make 规则可能包含 mv -b ...cp -b ... 命令。


        1.但不是在 Mac 或 BSD 上。

        【讨论】:

        • Mac OSX 提供的BSD mv 和cp 程序似乎没有提供-b 选项。下次我在 linux 中工作时,我将不得不看看这个。感谢您的提示,不知道这存在。
        猜你喜欢
        • 2018-11-19
        • 2014-01-18
        • 2012-08-12
        • 2015-06-27
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多