Terminal 如何从终端递归删除特定名称的文件

Terminal 如何从终端递归删除特定名称的文件,terminal,rm,Terminal,Rm,我想从子文件夹中删除所有emacs备份(~)文件。 我知道我可以在每个文件夹中使用cd,并使用rm*~(例如备份文件test.cpp~)删除它们 我如何用一个命令删除这些文件,而不用在每个文件夹中刻录cd (我试过rm-r*~和rm-rf*~但它们似乎不起作用)您可以使用find: find ./ -name *~ -exec rm {} \; 此命令将递归地列出与给定的名称模式匹配的所有文件。然后,它将执行为它们中的每一个提供的命令,用文件名替换大括号 唯一棘手的部分是分号,因为它是关闭命令

我想从子文件夹中删除所有emacs备份(~)文件。 我知道我可以在每个文件夹中使用
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/
我们可以使用
/
在当前数据库中搜索。