用于删除以〜结尾的临时文件的命令
很久以前,我发现这个有用的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
选项是可选的,但添加它将显示哪些文件已被删除。