Terminal 如何从终端递归删除特定名称的文件
我想从子文件夹中删除所有emacs备份(~)文件。 我知道我可以在每个文件夹中使用Terminal 如何从终端递归删除特定名称的文件,terminal,rm,Terminal,Rm,我想从子文件夹中删除所有emacs备份(~)文件。 我知道我可以在每个文件夹中使用cd,并使用rm*~(例如备份文件test.cpp~)删除它们 我如何用一个命令删除这些文件,而不用在每个文件夹中刻录cd (我试过rm-r*~和rm-rf*~但它们似乎不起作用)您可以使用find: find ./ -name *~ -exec rm {} \; 此命令将递归地列出与给定的名称模式匹配的所有文件。然后,它将执行为它们中的每一个提供的命令,用文件名替换大括号 唯一棘手的部分是分号,因为它是关闭命令
cd
,并使用rm*~
(例如备份文件test.cpp~)删除它们
我如何用一个命令删除这些文件,而不用在每个文件夹中刻录cd
(我试过rm-r*~
和rm-rf*~
但它们似乎不起作用)您可以使用find:
find ./ -name *~ -exec rm {} \;
此命令将递归地列出与给定的名称模式匹配的所有文件。然后,它将执行为它们中的每一个提供的命令,用文件名替换大括号
唯一棘手的部分是分号,因为它是关闭命令的,但必须防止bash,因此必须使用反斜杠
有关更多选项,请参阅 您可以使用
find
和exec
执行此操作。下面是一个示例,它实现了您想要做的事情:
find -name '*~' -exec rm {} \;
让我们详细分析一下它是如何工作的。
find
命令将在执行它的目录中递归,默认情况下,它将打印出找到的所有内容。使用-name'*~'
告诉我们只选择名称与正则表达式匹配的条目*~
。我们必须引用它,否则外壳可能会为我们扩展它。使用-exec rm{}
将对它找到的每一项执行rm
,并将{}
作为文件名的占位符。(最后一个;
是告诉find
这是命令结束的地方所必需的。这并不是什么大问题,但如果你不使用它,它会呜呜叫,什么也不做。\
是对它进行转义,因为;
是一个特殊的shell字符。)首先,删除这些文件的最好方法是不要创建它们(或者更确切地说,在中心位置创建它们):
这里有一种使用Emacs中的find
收集文件列表并有选择地对其执行操作的方法。M-x find name dired-RET/path/to/files-RET*~RET
应该将所有备份文件放在/path/to/files/
下,并将它们放在一个dired缓冲区中。然后,您可以执行普通的dired操作,比如用M标记文件
,用t
反转选择,用D
删除选择
find/path/to/directory/-type f-name'*filtercondition*'-delete
上面的命令将在文件夹匹配模式中递归查找文件,并仅删除文件如果
/
中有备份文件,这将不起作用,因为您还必须保护*~
免受bash的攻击。您还需要引用*~
。对于记录,最好尝试rm-f*~
而不是rm*~
因为如果没有备份文件,rm
会抱怨它找不到*~
。使用-f
会让它不会抱怨你并错误退出。为什么-exec rm{}\;
而不仅仅是-delete
?简短回答:这不需要删除目录,也不需要-type f
。更长的回答是使用-delete
与-prune
不起作用,因为-prune
意味着-depth
。在这种情况下,使用-rm{}并不重要
使其更易于以后扩展。此外,如果以后选择使用GNU Parallel,它也可以更好地与GNU Parallel配合使用。@RandyMorris也是afaik-delete是GNU(和BSD)POSIX中没有扩展,但我可能错了。感谢您的解释。我很确定删除emacs备份文件并不是一项真正值得您关注的任务,但我很欣赏您的推理。您是对的,在这种情况下这不重要,但我还是喜欢find exec。而不是/path/to/directory/
我们可以使用/
在当前数据库中搜索。