我有一个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
您可以从那里用sed
和sort -u
清理结果。
::编辑::
如果你有任何PNG的名字是其他PNG的正确子串,那么上面的方法可能会产生一些错误的答案。例如,如果您有promo_icon
和cheese_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