假设我们在一个目录中有以下文件:
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)
您的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 脚本等)等等...),您将不需要备份文件。
*.*~不会扩展到任何目录,它只会匹配当前目录中的任何文件或目录,该文件或目录在.某处有一个并以~
如果你想找到的所有文件为此在~从你在我使用的目录find一样
find -type f -name '*~' -delete
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |