ls 是否总是列出 rm 将删除的文件?

B.T*_*ner 35 bash hidden-files rm ls 18.04

我觉得我应该肯定知道的一些事情:如果我ls <something>,会rm <something>删除ls显示的完全相同的文件吗?是否有任何情况rm可以删除ls未显示的文件?(这是在 18.04 bash 中)

编辑:感谢所有回答的人。我认为完整的答案是所有答案的组合,所以我接受了最高票的答案作为“答案”。

在此过程中我学到了意想不到的事情:

  • ls 在处理参数时并不像你想象的那么简单
  • 在简单的 Ubuntu 安装中,.bashrc 别名 ls
  • 不要以破折号开头命名你的文件,因为它们看起来像命令参数,命名一个 -r 就是要求它!

Mr *_*unz 41

同时,双方lsrm在其上传递给它们的参数上操作。

这些参数可以是一个简单的文件,所以ls file.extrm file.ext操作同一个文件并且结果是明确的(列出文件/删除文件)。

如果参数是一个目录,则ls directory列出目录的内容,而rm directory不会按原样工作(即rm没有标志不能删除目录,而如果这样做rm -r directory,它将递归删除目录下的所有文件directory 和目录本身)。

但请记住,命令行参数可能会受到shell 扩展的影响,因此如果它们包含通配符、变量、其他命令的输出等,则并不总是保证将相同的参数传递给这两个命令。

作为一个极端的例子 think ls $(rand).txtand rm $(rand).txt,参数“相同”但结果却大不相同!

  • 关于 `ls` 和 `rm -r` 的另一个评论:命令 `ls &lt;directory&gt;` 不会显示目录中的隐藏文件,但是 `rm -r &lt;directory&gt;` * 会* 删除隐藏文件。 (5认同)
  • 还要考虑 `ls` 与 `rm *`,其中存在“隐藏”(点)文件,尽管这根本不是一个公平的比较,因为我没有编写 `ls *`。但是 `rm` 本身是没有意义的,所以整个事情真的是苹果和橘子。如果我理解正确,那就是你回答的关键,干得好:) (3认同)

ilk*_*chu 21

如果您正在考虑ls foo*.txtvs.之类的东西rm foo*.txt,那么是的,它们将显示和删除相同的文件。shell 扩展 glob,并将其传递给相关命令,这些命令对列出的文件起作用。一个列出它们,一个删除它们。

明显的区别是,如果这些文件中的任何一个碰巧是目录,ls则将列出其内容,但rm无法删除它。这通常不是一个问题,因为rm将消除较少比被显示ls

这里的大问题来自运行ls *rm *在包含以破折号开头文件名的目录中。他们将扩大到两个程序的命令行,如果你写出来自己,并ls会采取-r意味着“逆序”,而rm将采取-r意味着一个递归去除。如果您有至少两层深的子目录,则差异很重要。(ls *将显示第一级目录的内容,但rm -r *也将显示第一子级之后的所有内容。)

为避免这种情况,请在允许的 glob 中写入一个前导./来指示当前目录,和/或--在 glob(即rm ./*rm -- *)之前放置一个以表示选项处理结束。

对于像 glob 这样的 glob *.txt,这实际上不是问题,因为点是无效的选项字符,并且会导致错误(直到有人扩展实用程序以为其创造含义),但./无论如何将其放在那里仍然更安全。


当然,如果您更改了 shell 的 globbing 选项,或者在命令之间创建/移动/删除了文件,您也可以获得两个命令的不同结果,但我怀疑您的意思是这些情况中的任何一个。(安全地处理新的/移动的文件会非常混乱。)

  • 我无法抗拒,你已经把它卖给了我,我现在要去读它,回忆起我设法在许多文件名的末尾得到一个回车符的时间(试图看看我是否可以构建一个也可以作为 bash 脚本运行的 Windows 批处理文件......我没有看到那个!) (3认同)

Ser*_*nyy 18

留下只有抛开什么壳行为,让我们关注rm,并ls能对付自己。至少有一种情况ls将显示rm无法删除的内容涉及目录权限,而另一种情况是特殊目录....

文件夹权限

rm是对目录的操作,因为通过删除文件,您正在更改目录内容(或者换句话说,目录条目的列表,因为目录只不过是文件名和 inode 的列表)。这意味着您需要对目录的写权限。即使您是文件的所有者,如果没有目录权限,您也无法删除文件。该反过来也一样rm可以消除可能由其他人,如果你是目录的拥有者所拥有,文件。

所以,你很可能已经阅读并上的目录执行权限,这将让你穿越就好里的目录和浏览内容,例如 ls /bin/echo,但你不能rm /bin/echo,除非你的老板/bin 或提升自己的权限sudo

你会在任何地方看到这样的案例。这是一个这样的案例:https : //superuser.com/a/331124/418028


特殊目录“.” 和 '..'

另一种特殊情况是...目录。如果你这样做ls .ls ..,它会很高兴地向你展示内容,但rm不允许 'ing 它们:

$ rm -rf .
rm: refusing to remove '.' or '..' directory: skipping '.'
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 15

如果您键入ls *,然后rm *,很可能你会删除超过文件ls显示-他们可能在年底之间的微小的时间间隔被创建ls和启动rm


Sha*_*dow 9

ls *并且rm *不负责扩展 glob - 这是由 shell 在将其传递给命令之前完成的。

这意味着您可以对扩展的文件列表使用任何命令 - 所以我会使用尽可能少的东西。

因此,执行此操作的更好方法(或至少是另一种方法)是跳过中间人。

echo *将向您显示将传递给您的rm命令的确切内容。

  • 或 `printf "%s\n" *` 以获得对带空格的文件名的明确视图。(或者用 `%q` 来处理换行符和控制字符,以牺牲更丑陋的输出为代价。) (3认同)
  • 谢谢,我喜欢在这种情况下使用 echo 而不是 ls 的想法。 (2认同)