如何从终端递归删除某些名称的文件
我想从子文件夹中删除所有emacs备份(〜)文件。 我知道我可以在每个文件夹中使用cd
,并使用rm *~
(例如备份文件test.cpp〜)将它们删除。如何从终端递归删除某些名称的文件
如何用一个命令删除这些文件,而无需在每个文件夹中进行cd'ing操作?
(我试过rm -r *~
和rm -rf *~
,但他们似乎并不管用)
你可以用find
和exec
来做到这一点。下面是一个你想要做的例子:
find -name '*~' -exec rm {} \;
让我们来分解它是如何工作的。 find
命令将执行从其执行的目录,默认情况下它将打印出它找到的所有内容。使用-name '*~'
告诉我们只选择名称与正则表达式*~
匹配的条目。我们必须引用它,否则shell可能会为我们扩展它。使用-exec rm {}
将执行rm
找到的每件事情,并将{}
作为文件名的占位符。 (最后的;
需要告诉find
这是命令结束的地方,这不是什么大不了的事情,但如果你不使用它,它会发出呜呜声,什么也不做,\
就是为了逃避它,因为;
是一个特殊的shell字符)
为什么'-exec rm {} \;'而不是'-delete'? –
简短回答:这不会删除目录,也不需要'-type f'。较长的答案是使用'-delete'不能与'-prune'一起使用,因为'-prune'意味着'-depth'。在这种情况下并不重要,但是使用'rm {}'可以使它在以后更具可扩展性。此外,如果您稍后选择使用GNU Parallel,它也可以更好地工作。 –
@RandyMorris也afaik -delete是一个GNU(和BSD)扩展,它不在POSIX中,但我可能是错误的。 –
你会发现使用:
find ./ -name *~ -exec rm {} \;
此命令将递归列出所有文件,匹配给定的图案名称。然后它将执行为它们中的每一个提供的命令,用文件名替换花括号。
唯一棘手的部分是分号,因为这是关闭命令,但它必须受到保护而不受bash影响,因此也是反斜杠。
有关更多选项,请参见https://linux.die.net/man/1/find。
如果在'。/'中有备份文件,这将不起作用,因为你也必须保护'*〜'免于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
删除选择。
为了记录,使用'rm -f *〜'而不是'rm *〜'是个好主意,因为如果没有备份文件,'rm'会抱怨它找不到'*〜' 。使用'-f'会使它不会抱怨你并退出时出错。 –