【问题标题】:Find unreferenced png files in an Xcode workspace在 Xcode 工作区中查找未引用的 png 文件
【发布时间】: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 文件。不过,其他建议非常有帮助,谢谢。

标签: xcode bash sed grep sh


【解决方案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_iconpromo_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_icon\b
\bcapture-bg-1\b

所以当你 grep 它与引用列表匹配时,它只会在每个 PNG 的名称是图像引用中的全名(而不是更长名称的子字符串)时匹配。

【讨论】:

  • 不幸的是,我无法让这种方法发挥作用。不过这些想法很好。
【解决方案2】:

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

#!/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多