用于删除以〜结尾的临时文件的命令

很久以前,我发现这个有用的bash别名(我的〜/ .bash_aliases的内容

# aliases # finds temporary files ending with '~' and deletes them alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f' 

现在我尝试在cd之后使用rm~到包含以~结尾的3个文件的某个目录

我在终端中收到此错误,文件没有被删除

 find: paths must precede expression: 1n.in~ Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 

当我从/home/me尝试rm~时,似乎什么也没做。 或者可能需要花费很多时间。

请告诉我为什么我会收到错误,以及如何解决它。

谢谢!

你的bash别名编写得不好(单引号没有得到很好的使用)。 相反它应该是:

 alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f' 

现在,我个人不喜欢无用的管道和xargs ,所以你的别名会更好地写成:

 alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +' 

-type f选项只能找到文件(不是目录,链接等), rm-v选项是详细的(打印出它正在删除的内容)。 最后的+ ,以便find与所有找到的文件一起运行rm (只生成rm一个实例,而不是每个文件一个)。

现在来自man bash

对于几乎所有目的,别名都被shell函数取代。

而不是别名,最好使用一个函数:在.bash_aliases文件中注释你的别名(即在该行前放一个# ),在文件.bashrc ,放置这个函数 (在文件的任何地方,at结束很好):

 rm~() { find . -name "*~" -type f -exec /bin/rm -fv -- {} + } 

另外,正如其他答案所提到的,您可以使用-delete命令进行查找。 在这种情况下,你的rm~函数将是:

 rm~() { find . -name "*~" -type f -printf "Removing file %p\n" -delete } 

事实上,你可以创建一个很酷的函数来接受一个参数,比如说--dry-run ,它只会输出它将删除的内容:

 rm~() { case "$1" in "--dry-run") find . -name "*~" -type f -printf "[dry-run] Removing file %p\n" ;; "") find . -name "*~" -type f -printf "Removing file %p\n" -delete ;; *) echo "Unsupported option \`$1'. Did you mean --dry-run?" ;; esac } 

然后用作:

 rm~ --dry-run 

仅显示将被删除的文件(但不删除它们)然后

 rm~ 

当你对此感到满意时

适应并扩展您的需求!

注意。 您必须打开一个新终端才能使更改生效。

*~在被分配到别名之前由shell扩展。 实际的任务是:

 alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f' 

我建议使用函数而不是别名,这些更强大,更容易处理引号。

虽然我们在这里,但删除多余的. (如果没有给出参数,则隐含当前目录)并停止滥用xargs因为已存在-delete选项。

 rm~() { find -name '*~' -ls -delete; } 

-ls选项是可选的,但添加它将显示哪些文件已被删除。