如何在Xcode项目中找到未使用的图像?

Pau*_*son 95 xcode assets

有没有人在Xcode项目中找到未使用的图像?(假设代码或项目文件中的所有文件都是由名称引用的 - 没有代码生成的文件名.)

这些文件往往会在项目的整个生命周期中累积,很难判断删除任何给定的png是否安全.

Ed *_*nus 80

这是一个更强大的解决方案 - 它会检查任何文本文件中对basename的任何引用.请注意上面的解决方案不包括故事板文件(完全可以理解,当时它们不存在).

Ack非常快,但如果这个脚本频繁运行,还有一些明显的优化.例如,如果您同时具有视网膜/非视网膜资产,则此代码会检查每个基本名称两次.

#!/bin/bash

for i in `find . -name "*.png" -o -name "*.jpg"`; do 
    file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x`
    result=`ack -i "$file"`
    if [ -z "$result" ]; then
        echo "$i"
    fi
done

# Ex: to remove from git
# for i in `./script/unused_images.sh`; do git rm "$i"; done
Run Code Online (Sandbox Code Playgroud)

  • 安装[Homebrew](http://mxcl.github.com/homebrew/),然后执行`brew install ack`. (12认同)
  • 我在哪里可以找到确认? (3认同)
  • @Johnny你需要让文件可执行(`chmod a + x FindUnusedImages.sh`),然后像bash中的任何其他程序一样运行它./ FindUnusedImages.sh` (2认同)
  • 我做了一个修改,忽略了pbxproj文件(因此忽略了xcode项目中的文件,但没有在代码或nibs/storyboards中使用):`result = \`ack --ignore-file = match:/.\. pbxproj/-i"$ file"\``这需要ack 2.0及以上版本 (2认同)
  • milanpanchal,您可以将脚本放在任何位置,只需从要用作搜索图像的根目录的任何目录(例如项目根文件夹)执行它.您可以将它放在〜/ script /中,然后转到项目根文件夹并通过直接指向脚本来运行它:〜/ script/unused_images.sh (2认同)

Rom*_*man 59

对于未包含在项目中但仅在文件夹中挂起的文件,您可以按

cmd ⌘+ alt ⌥+A

他们不会变灰.

对于既未在xib中也未在代码中引用的文件,此类内容可能有效:

#!/bin/sh
PROJ=`find . -name '*.xib' -o -name '*.[mh]'`

find . -iname '*.png' | while read png
do
    name=`basename $png`
    if ! grep -qhs "$name" "$PROJ"; then
        echo "$png is not referenced"
    fi
done
Run Code Online (Sandbox Code Playgroud)

  • 这种情况无法解决的一种情况是我们可能在构造其名称后以编程方式加载图像.比如arm1.png,arm2.png .... arm22.png.我可以在for循环和加载中构造它们的名称.比如游戏 (8认同)
  • 如果遇到错误:没有这样的文件或目录,可能是由于文件路径中的空格.引号需要在grep行中添加,所以它会:if!grep -qhs"$ name""$ PROJ"; (5认同)
  • 这个Cmd + Opt + A技巧真的很聪明.谢谢! (4认同)
  • Cmd + Opt + a似乎不再适用于XCode 5.它应该触发什么? (3认同)

rob*_*rob 24

我尝试了Roman的解决方案,并添加了一些调整来处理视网膜图像.它运行良好,但请记住,图像名称可以在代码中以编程方式生成,并且此脚本会错误地将这些图像列为未引用的.例如,你可能有

NSString *imageName = [NSString stringWithFormat:@"image_%d.png", 1];

此脚本将错误地认为image_1.png是未引用的.

这是修改后的脚本:

#!/bin/sh
PROJ=`find . -name '*.xib' -o -name '*.[mh]' -o -name '*.storyboard' -o -name '*.mm'`

for png in `find . -name '*.png'`
do
   name=`basename -s .png $png`
   name=`basename -s @2x $name`
   if ! grep -qhs "$name" "$PROJ"; then
        echo "$png"
   fi
done
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,名称中包含空格的文件夹会导致脚本出现问题. (3认同)
  • 如果遇到错误:没有这样的文件或目录,可能是由于文件路径中的空格.引号需要在grep行中添加,所以它会:if!grep -qhs"$ name""$ PROJ"; (3认同)
  • 此脚本列出了我的所有文件 (3认同)
  • 我不知道为什么它不为我工作它给我所有的png图像 (2认同)

Les*_*Fun 24

请试试LSUnusedResources.

它受到jeffhodnett的Unused的严重影响,但老实说Unused非常慢,结果并不完全正确.所以我做了一些性能优化,搜索速度比Unused快.

  • 哇,这是一个很棒的工具!比尝试运行这些脚本好多了.您可以直观地看到所有未使用的图像,并删除所需的图像.我找到的一个问题是它没有拾取plist中引用的图像 (2认同)
  • 线程中最好的一个.我希望这更高,我可以不止一次投票! (2认同)

Aru*_*run 12

也许你可以尝试修长,做得不错.

更新:有了emcmanus的想法,我继续创建一个没有确认的小工具,只是为了避免在机器中进行额外的设置.

https://github.com/arun80/xcodeutils


ing*_*ham 6

只有这个脚本对我有用,甚至可以处理文件名中的空格:

编辑

更新以支持swift文件和cocoapod.默认情况下,它不包括Pods目录并仅检查项目文件.要运行以检查Pods文件夹,请使用--podattrbiute 运行:

/.finunusedimages.sh --pod

这是实际的脚本:

#!/bin/sh

#varables
baseCmd="find ." 
attrs="-name '*.xib' -o -name '*.[mh]' -o -name '*.storyboard' -o -name '*.mm' -o -name '*.swift'"
excudePodFiles="-not \( -path  */Pods/* -prune \)"
imgPathes="find . -iname '*.png' -print0"


#finalize commands
if [ "$1" != "--pod" ]; then
    echo "Pod files excluded"
    attrs="$excudePodFiles $attrs"
    imgPathes="find . $excudePodFiles -iname '*.png' -print0"
fi

#select project files to check
projFiles=`eval "$baseCmd $attrs"`
echo "Looking for in files: $projFiles"

#check images
eval "$imgPathes" | while read -d $'\0' png
do
   name=`basename -s .png "$png"`
   name=`basename -s @2x $name`
   name=`basename -s @3x $name`

   if grep -qhs "$name" $projFiles; then
        echo "(used - $png)"
   else
        echo "!!!UNUSED - $png"
   fi
done
Run Code Online (Sandbox Code Playgroud)