我有一个源代码树,其中包含许多具有不同文件类型的文件。源代码树有许多子文件夹。如何保留源代码树的文件夹结构并删除除 .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 "{}" \;
部分。