Как найти неиспользуемые изображения в проекте Xcode? - PullRequest
93 голосов
/ 24 мая 2011

Есть ли у кого-нибудь одна строка, чтобы найти неиспользуемые изображения в проекте XCode? (Предполагается, что на все файлы ссылаются по имени в коде или файлах проекта - код не создает имена файлов.)

Эти файлы имеют тенденцию накапливаться в течение жизни проекта, и может быть трудно определить, безопасно ли удалять любой данный png.

Ответы [ 13 ]

80 голосов
/ 28 ноября 2011

Это более надежное решение - оно проверяет любую ссылку на базовое имя в любом текстовом файле. Обратите внимание на приведенные выше решения, которые не включали файлы раскадровки (вполне понятно, что их не было в то время).

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
58 голосов
/ 24 мая 2011

Для файлов, которые не включены в проект, но просто находятся в папке, вы можете нажать

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
24 голосов
/ 12 октября 2011

Я попробовал решение Романа и добавил несколько настроек для обработки изображений сетчатки.Это работает хорошо, но помните, что имена изображений могут быть сгенерированы программно в коде, и этот сценарий неправильно перечислит эти изображения как не связанные.Например, у вас может быть

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
23 голосов
/ 02 сентября 2015

Пожалуйста, попробуйте LSUnusedResources .

Это сильно зависит от Unused Джеффходнетта, но, честно говоря, Unused очень медленно, и результаты не совсем корректны.Поэтому я немного оптимизировал производительность, скорость поиска выше, чем у Unused.

12 голосов
/ 06 ноября 2012

Может быть, вы можете попробовать Стройный , делает достойную работу.

обновление: С идеей emcmanus я создал небольшую утилиту без подтверждения, чтобы избежать дополнительных настроек на машине.

https://github.com/arun80/xcodeutils

6 голосов
/ 02 июня 2015

У меня работает только этот скрипт, который обрабатывает пространство в именах файлов:

Редактировать

Обновлен для поддержки swift файлов и cocoapod.По умолчанию он исключает каталог Pods и проверяет только файлы проекта.Чтобы запустить и проверить папку Pods, запустите команду --pod attrbiute:

/.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
3 голосов
/ 18 сентября 2014

Я внес небольшое изменение в превосходный ответ, предоставленный @EdMcManus, для обработки проектов, использующих каталоги активов.

#!/bin/bash

for i in `find . -name "*.imageset"`; do
    file=`basename -s .imageset "$i"`
    result=`ack -i "$file" --ignore-dir="*.xcassets"`
    if [ -z "$result" ]; then
        echo "$i"
    fi
done

Я не пишу скрипты bash, так что если есть какие-то улучшенияздесь (вероятно), дайте мне знать в комментариях, и я буду обновлять его.

2 голосов
/ 31 августа 2017

Я использовал этот фреймворк: -

http://jeffhodnett.github.io/Unused/

чертовски хорошо работает! Проблемы возникали только в двух местах, когда имена изображений взяты с сервера и когда имя ресурса изображения отличается от имени изображения в папке ресурса ...

2 голосов
/ 20 апреля 2017

Используя другие ответы, этот является хорошим примером того, как игнорировать изображения в двух каталогах и не искать экземпляры изображений в файлах pbxproj или xcassets (будьте осторожны с пиктограммой приложения и заставками). Измените * в --ignore-dir = *. Xcassets для соответствия вашему каталогу:

#!/bin/bash

for i in `find . -not \( -path ./Frameworks -prune \) -not \( -path ./Carthage -prune \) -not \( -path ./Pods -prune \) -name "*.png" -o -name "*.jpg"`; do 
    file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x | xargs basename -s @3x`
    result=`ack -i --ignore-file=ext:pbxproj --ignore-dir=*.xcassets "$file"`
    if [ -z "$result" ]; then
        echo "$i"
    fi
done
2 голосов
/ 30 марта 2017

Вы можете попробовать Приложение FauxPas для Xcode . Это действительно хорошо в поисках недостающих изображений и многих других проблем / нарушений, связанных с проектом Xcode.

...