在Xcode工作区中查找未引用的png文件

时间:2015-03-31 16:25:00

标签: xcode bash sed grep sh

我有一个包含数百个png文件的Xcode工作区,并希望列出那些未引用的文件。

示例pngs:

capture-bg-1.png
capture-bg-1@2x.png
promo_icon.png
promo_icon@2x.png

" promo_icon"的参考示例(XML文件):

<string>promo_icon</string>

&#34; promo_icon&#34;的参考示例(目标-C):

[UIImage imageNamed:@"promo_icon"]

我想获得一个文件名列表,包括&#34; capture-bg-1&#34; (假设它没有匹配&#34; promo_icon&#34;确实如此)。

有点皱纹是有一个.pbxproj文件(XML),它引用了工作区中的每个png文件,因此需要从搜索中排除该文件。

以下命令获取所有唯一的文件名部分(不包括文件夹以及&#39; @&#39;和&#39;。&#39;)以进行评估。

find . -name *.png -exec basename {} \;| sed 's/[.@].*$//' | uniq

我将管道文件名部分的grep部分是问题。这个grep找到了引用或不引用的文件&#39; promo_icon&#39;并列出参考。一个空的返回值(没有引用)将是一个png文件我正在寻找一个列表:

grep -I -R promo_icon . | grep -v pbxproj

然而,我无法弄清楚如何以功能的方式将两者结合起来。有这个片段(https://stackoverflow.com/a/16258198/26235)用于在sh中执行此操作,但它无法正常工作。

2 个答案:

答案 0 :(得分:1)

更简单的方法可能是将所有PNG名称列表放在一个文件中,每行一个。然后将所有对PNG名称的引用列表放入另一个文件中,每行一个。然后grep -v -f第一个文件与第二个文件。无论回复什么都是你的答案。

首先,

find . -name '*.png' -printf %f | sed -e 's/[.@].*$//' | sort -u > pngList

然后,

grep -RI --exclude .pbxproj -e '<string>.*png</string>' \
                            -e 'UIImage imageNamed' . > pngRefs

最后,

grep -v -f pngList pngRefs

您可以使用sedsort -u从那里清除结果。

::编辑::

如果您有任何名称是其他PNG的正确子串的PNG,上述方法可能会产生一些错误的答案。例如,如果您promo_iconcheese_promo_icon并且promo_icon从未被引用但cheese_promo_icon 被引用,则上述方法将不会检测到{ {1}}未被引用。

要解决此问题,您可以使用promo_icon(字边界)序列包围PNG名称模式:

\b

这样你的pngList文件将包含这样的行:

find . -name '*.png' -printf %f | sed -e 's/^/\\b/' -e 's/$/\\b/' -e 's/[.@].*$//' | sort -u > pngList

所以当你\bpromo_icon\b \bcapture-bg-1\b 对照引用列表时,它只会匹配每个PNG的名称是图像引用中的整个名称(而不是更长名称的子字符串)。

答案 1 :(得分:0)

这是在Xcode项目中查找未引用图像的脚本。一个问题是,人们可能会使用字符串格式来构建对图像的引用,而这里的描述是不明智的。 Mac用户希望通过brew安装findutils,以获得findprintf

#!/bin/sh
# Finds unreferenced PNG assets in an xcode project

# Get a list of png file stems, stripping out folder information, 'png' extension
# and '@2x' parts of the filename
for png in `find . -name '*.png' -printf '%f\n' | sed -e 's/[.@].*$//' | sort -u`

# Loop through the files and print out a list of files not referenced.  Keep in mind
# that some files like 'asset-1' may be referred to in code like 'asset-%d' so be careful
do
    name=`basename $png`
    if ! grep -qRI --exclude project.pbxproj --exclude-dir Podfile $png . ; then
        echo "$png is not referenced"
    fi
done