假设,我们的目录中有以下文件:
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