如何从终端递归删除某些名称的文件

问题描述:

我想从子文件夹中删除所有emacs备份(〜)文件。 我知道我可以在每个文件夹中使用cd,并使用rm *~(例如备份文件test.cpp〜)将它们删除。如何从终端递归删除某些名称的文件

如何用一个命令删除这些文件,而无需在每个文件夹中进行cd'ing操作?

(我试过rm -r *~rm -rf *~,但他们似乎并不管用)

+0

为了记录,使用'rm -f *〜'而不是'rm *〜'是个好主意,因为如果没有备份文件,'rm'会抱怨它找不到'*〜' 。使用'-f'会使它不会抱怨你并退出时出错。 –

你可以用findexec来做到这一点。下面是一个你想要做的例子:

find -name '*~' -exec rm {} \; 

让我们来分解它是如何工作的。 find命令将执行从其执行的目录,默认情况下它将打印出它找到的所有内容。使用-name '*~'告诉我们只选择名称与正则表达式*~匹配的条目。我们必须引用它,否则shell可能会为我们扩展它。使用-exec rm {}将执行rm找到的每件事情,并将{}作为文件名的占位符。 (最后的;需要告诉find这是命令结束的地方,这不是什么大不了的事情,但如果你不使用它,它会发出呜呜声,什么也不做,\就是为了逃避它,因为;是一个特殊的shell字符)

+0

为什么'-exec rm {} \;'而不是'-delete'? –

+2

简短回答:这不会删除目录,也不需要'-type f'。较长的答案是使用'-delete'不能与'-prune'一起使用,因为'-prune'意味着'-depth'。在这种情况下并不重要,但是使用'rm {}'可以使它在以后更具可扩展性。此外,如果您稍后选择使用GNU Parallel,它也可以更好地工作。 –

+0

@RandyMorris也afaik -delete是一个GNU(和BSD)扩展,它不在POSIX中,但我可能是错误的。 –

你会发现使用:

find ./ -name *~ -exec rm {} \; 

此命令将递归列出所有文件,匹配给定的图案名称。然后它将执行为它们中的每一个提供的命令,用文件名替换花括号。

唯一棘手的部分是分号,因为这是关闭命令,但它必须受到保护而不受bash影响,因此也是反斜杠。

有关更多选项,请参见https://linux.die.net/man/1/find

+1

如果在'。/'中有备份文件,这将不起作用,因为你也必须保护'*〜'免于bash。你也需要引用'*〜'。 –

首先,删除这些文件是不能创建(或更确切地说,在一个中心位置创建它们)的最佳方法:https://*.com/a/151946/245173

下面是使用find从Emacs的收集方式文件列表并选择性地对它们执行操作。 M-x find-name-dired RET /path/to/files RET *~ RET应该获得/path/to/files/下的所有备份文件,并将它们放在直接缓冲区中。然后你可以用标准文件m做正常的事情,用t反转选择,然后用D删除选择。