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



我有一个Xcode工作区,里面有几百个png文件,我想列出那些未引用的文件。

示例pngs:

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文件,因此需要将该文件从搜索中排除。

以下命令获取所有唯一的文件名部分(不包括文件夹以及"@"one_answers"."之后的所有部分)以进行评估。

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

我将文件名部分管道传输到的grep部分就是问题所在。此grep查找引用或不引用"promo_icon"的文件,并列出引用。一个空的返回值(没有引用)将是一个png文件,我正在寻找一个列表:

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

然而,我不知道如何将两者以功能的方式结合起来。有这个片段(https://stackoverflow.com/a/16258198/26235)感谢在sh中这样做,但它不起作用。

一种更简单的方法可能是将所有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被引用,则上述方法将不会检测到promo_icon未被引用。

为了解决这个问题,您可以用b(单词边界)序列包围PNG名称模式:

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

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

bpromo_iconb
bcapture-bg-1b

因此,当您根据引用列表grep时,只有当每个PNG的名称是图像引用中的整个名称(而不是较长名称的子字符串)时,它才会匹配。

这是在Xcode项目中查找未引用图像的脚本。一个棘手的问题是,人们可能会使用字符串格式来构建对图像的引用,而这在这里没有说明。Mac用户希望通过brew安装findutils,以获得带有printf:的find版本

#!/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 '%fn' | 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

相关内容

  • 没有找到相关文章

最新更新