2015-03-31 2 views
2

У меня есть рабочее пространство Xcode с несколькими сотнями png-файлов и вы хотите перечислить те, которые не указаны.Найти unreferenced png-файлы в рабочей области Xcode

Пример PNGs:

capture-bg-1.png 
[email protected] 
promo_icon.png 
[email protected] 

Ссылочный пример для "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/[[email protected]].*$//' | uniq 

Эта часть grep, в которую я буду обращаться с файлами, является проблемой. Этот grep находит файлы, которые делают или не ссылаются на «promo_icon» и перечисляют ссылки. Пустое возвращаемое значение (без ссылки) будет PNG-файл Я ищу список:

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

Однако я не могу понять, как совместить два в функциональном стиле. Существует этот фрагмент (https://stackoverflow.com/a/16258198/26235) для этого в sh, но он не работает.

+1

Вместо '-exec {} базовое имя \;' вы должны просто сделать '-printf% f'. Тот же результат, но не нужно вызывать подоболочку для каждого файла. Кроме того, ваш 'uniq' не работает правильно: он работает корректно только в отсортированных списках. Попробуйте 'sort -u' вместо этого. – dg99

+0

И, кстати, если '.pbxproj' имеет ссылку на каждый png-файл, почему бы просто не использовать его содержимое напрямую, а не запускать' find' вообще? – dg99

+0

'find' очень быстрая, поэтому нет необходимости разбирать файл' .pbxproj'. Другой совет очень полезен, хотя, спасибо. –

ответ

0

Это сценарий, который находит unreferenced изображения в проекте Xcode. Одна из них заключается в том, что люди могут использовать форматирование строк для построения ссылок на изображения, и это неучтенное здесь. пользователи Mac захотят установить Findutils через варку, чтобы получить версию find с printf:

#!/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/[[email protected]].*$//' | 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 
1

Более простой способ сделать это может заключаться в том, чтобы поместить список всех имен PNG в один файл, по одному на строку. Затем поместите список всех ссылок на имена PNG в другой файл, по одному на строку. Затем grep -v -f первый файл против второго. Все, что возвращается, - это ваш ответ.

Во-первых,

find . -name '*.png' -printf %f | sed -e 's/[[email protected]].*$//' | sort -u > pngList 

Затем

grep -RI --exclude .pbxproj -e '<string>.*png</string>' \ 
          -e 'UIImage imageNamed' . > pngRefs 

Наконец,

grep -v -f pngList pngRefs 

И вы можете очистить результаты с sed и sort -u оттуда.

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

выше подход может дать некоторые неправильные ответы, если у вас есть какие-либо PNGs, чьи имена собственные подстроки другой в формате PNG. Например, если у вас есть promo_icon и cheese_promo_icon и promo_icon никогда не ссылаются, но cheese_promo_icon- это ссылка на. Приведенный выше подход не обнаружит, что promo_icon не найден.

Чтобы справиться с этой проблемой, вы можете окружить свои PNG шаблоны имен с \b (слово-граница) последовательностей:

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

Таким образом, ваш файл pngList будет содержать такие строки:

\bpromo_icon\b 
\bcapture-bg-1\b 

поэтому, когда вы grep его против списка ссылок, это будет соответствовать только тогда, когда имя каждого PNG является полным именем в изображении ref (а не подстрокой более длинного имени).

+0

У меня возникли проблемы с тем, что этот метод работает, к сожалению. Идеи хороши, хотя. –