递归 rm 对我不起作用

use*_*035 0 recursive rm

假设我们在一个目录中有以下文件:

test.txt
test.txt~
/subdir
  test1.txt
  test1.txt~
Run Code Online (Sandbox Code Playgroud)

当我rm -r ./*.*~在 top dir 中运行时,只有 test.txt~ 被删除。

尽管我使用了递归标志,为什么它不执行递归删除?

您可以使用以下脚本重现我的案例:

#create dir and 1-st level test files
mkdir dir
cd dir
touch test.txt
touch test.txt~

#create subdir and 2-nd level test files
mkdir subdir
cd subdir/
touch test1.txt~
touch test1.txt

cd ..
rm -r ./*.*~
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 6

您的rm -r *.*~(与 相同rm -r ./*.*~)将删除匹配*.*~的文件和目录,即名称包含点并以~

subdir不包含任何点,所以不适合。

阅读glob(7)并记住是你的 shell(不是/bin/rm程序!)执行globbing

所以发生的事情是你rm -r ./*.*~在你的 shell 中输入。您的外壳正在将其扩展为rm -r ./test.txt~; 然后找到/bin/rm程序的$PATH,调用叉(2)创建一个子进程,然后调用execve(2)/bin/rm的程序,用一个参数数组rm -rf ./test.txt~所以rm即使不看./subdir

要删除任何直接子目录中的每个备份文件,请键入rm */*.*~;使用最近的 bash(版本 4 或更高版本),zsh您甚至可以删除文件树深处的任何备份文件rm **/*.*

了解 shell 正在做什么的一种可能方法是将您的命令(例如rm)替换为echo. 这应该给你扩展(但阅读echo(1),因为echo了解一些选项,如-n)。在一些好的 shell 上,您甚至可以使用自动完成tab键。我使用zsh作为我的交互式 shell,因为我喜欢它的自动完成功能。

最后,rm(1)知道-i(在删除之前以交互方式询问您)。所以我会建议rm -i **/*~

顺便说一句,如果你不了解版本控制系统,是时候学习它们了(我强烈推荐使用git ....),特别是对于像文件这样的“源”代码(C 或 Python 程序、shell 脚本等)等等...),您将不需要备份文件。


Eri*_*ouf 5

*.*~不会扩展到任何目录,它只会匹配当前目录中的任何文件或目录,该文件或目录在.某处有一个并以~

如果你想找到的所有文件为此在~从你在我使用的目录find一样

find -type f -name '*~' -delete
Run Code Online (Sandbox Code Playgroud)