递归 rm 对我不起作用

递归 rm 对我不起作用

假设,我们的目录中有以下文件:

test.txt
test.txt~
/subdir
  test1.txt
  test1.txt~

当我rm -r ./*.*~在顶级目录中运行时,仅删除 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 ./*.*~

答案1

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

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

全局(7)请记住,是您的 shell(而不是程序/bin/rm!)执行以下操作:通配

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

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

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

终于,房间(1)了解-i(在删除之前以交互方式询问您)。所以我会建议rm -i **/*~

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

答案2

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

如果您想查找~以您所在目录结尾的所有文件,我会使用find类似

find -type f -name '*~' -delete

相关内容