【发布时间】:2015-06-05 02:01:47
【问题描述】:
我有一个包含数百个 png 文件的 Xcode 工作区,我想列出那些未被引用的文件。
示例 png:
capture-bg-1.png
capture-bg-1@2x.png
promo_icon.png
promo_icon@2x.png
“promo_icon”(XML 文件)的参考示例:
<string>promo_icon</string>
“promo_icon”(Objective-C)的参考示例:
[UIImage imageNamed:@"promo_icon"]
我想得到一个文件名列表,包括“capture-bg-1”(假设它没有像“promo_icon”那样的匹配项)。
有点麻烦的是,有一个 .pbxproj 文件 (XML) 引用了工作区中的每个 png 文件,因此需要从搜索中排除该文件。
以下命令获取所有唯一文件名部分(不包括文件夹以及“@”和“.”之后的所有内容)以进行评估。
find . -name *.png -exec basename {} \;| sed 's/[.@].*$//' | uniq
我将文件名部分通过管道传输到的 grep 部分是问题所在。此 grep 查找引用或不引用“promo_icon”的文件并列出引用。一个空的返回值(无引用)将是一个 png 文件,我正在寻找以下列表:
grep -I -R promo_icon . | grep -v pbxproj
但是我不知道如何以一种实用的方式将两者结合起来。有这个 sn-p (https://stackoverflow.com/a/16258198/26235) 可以在 sh 中执行此操作,但它不起作用。
【问题讨论】:
-
你应该只使用
-printf %f而不是-exec basename {} \;。结果相同,但无需为每个文件调用子shell。此外,您的uniq没有做正确的事情:它只能在排序列表上正常工作。请改用sort -u。 -
而且,顺便说一句,如果
.pbxproj引用了每个 png 文件,为什么不直接使用它的内容而不是运行find呢? -
find非常快,因此无需解析.pbxproj文件。不过,其他建议非常有帮助,谢谢。