linux find 命令仅保留 .h 文件

linux find 命令仅保留 .h 文件

我有一个源代码树,其中包含许多具有不同文件类型的文件。源代码树有许多子文件夹。如何保留源代码树的文件夹结构并删除除 .h 文件之外的所有文件?

答案1

你可以使用find否定谓词来实现这一点。基本上,创建一个命令来查找你想要保留的所有文件,否定匹配条件(这样它现在匹配你想要的文件)您想保留哪些文件),并告诉它删除这些文件或者干脆将它们移开。

例如,此命令将打印当前目录下所有以 结尾的文件列表,包括子目录.h

find . -type f -name '*.h' -print

-type f将匹配限制为仅限常规文件;而不是目录、设备节点等。周围的引用*.h很重要。)

现在,反转名称条件以打印所有符合条件的文件不是名字以以下形式结尾.h

find . -type f -not -name '*.h' -print

(请注意,这-not不符合 POSIX 标准,但在这里它更干净,因为它不需要 shell 转义。您也可以使用 POSIX 标准!,但至少 bash 要求对其!进行转义。)

一旦你满意如果文件列表与要删除的文件相匹配,只需将其替换-print-delete即可实际删除文件。或者,如果您需要 POSIX 解决方案(再次),则可以使用-exec rm '{}' '+'而不是-delete,代价是调用rm未知次数。

答案2

您可以使用一个简单的命令来实现这一点:

find . -not -name *.h -exec rm -r "{}" \;

如果您想确保它会删除您确实想要的内容,您可以删除该-exec部分并添加标志-print以查看匹配的内容。一旦您确定,您就可以附加该-exec rm -r "{}" \;部分。

相关内容