Jak znaleźć nieużywane obrazy w projekcie Xcode?

Ma ktoś jedną linię, aby znaleźć nieużywane obrazy w projekcie Xcode? (Zakładając, że wszystkie pliki są odniesione przez nazwę w kodzie lub pliki projektu-Brak nazw plików generowanych kodem.)

Te pliki mają tendencję do gromadzenia się przez cały okres istnienia projektu i może być trudno stwierdzić, czy usunięcie danego png jest bezpieczne.

Author: Ahmad F, 2011-05-24

13 answers

Dla plików, które nie są zawarte w projekcie, ale po prostu pozostają w folderze, możesz nacisnąć

cmd ⌘ + alt ⌥ + A

I nie będą szarawe.

W przypadku plików, które nie są wymienione ani w xib, ani w kodzie, coś takiego może działać:

#!/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
 57
Author: Roman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 15:15:16

Jest to bardziej solidne rozwiązanie-sprawdza, czy odnosi się do nazwy bazowej w dowolnym pliku tekstowym. Zwróć uwagę na powyższe rozwiązania, które nie zawierały plików storyboard (całkowicie zrozumiałe, nie istniały w tym czasie).

Ack robi to dość szybko, ale istnieje kilka oczywistych optymalizacji, jeśli ten skrypt działa często. Ten kod sprawdza każdą nazwę podstawową dwa razy, jeśli na przykład masz zarówno zasoby siatkówki, jak i inne.

#!/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
 79
Author: Ed McManus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-19 07:59:50

Wypróbowałem rozwiązanie Romana i dodałem kilka poprawek do obsługi obrazów siatkówki. To działa dobrze, ale pamiętaj, że nazwy obrazów mogą być generowane programowo w kodzie, a ten skrypt błędnie wyświetli te obrazy jako nieferencyjne. Na przykład możesz mieć

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

Ten skrypt błędnie uzna image_1.png za nieferencyjny.

Oto zmodyfikowany skrypt:

#!/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
Author: rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-11 08:11:14

Proszę spróbować LSUnusedResources .

Jest pod silnym wpływem Nieużywany jeffhodnett, ale szczerze mówiąc Nieużywany jest bardzo powolny, a wyniki nie są do końca poprawne. Więc zrobiłem trochę optymalizacji wydajności, szybkość wyszukiwania jest szybsza niż nieużywana.

 18
Author: LessFun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 02:31:53

Być może Możesz spróbować smukły , robi przyzwoitą robotę.

Update: z emcmanus idea, poszedłem do przodu i stworzyć mały util bez ack tylko po to, aby uniknąć dodatkowej konfiguracji w maszynie.

Https://github.com/arun80/xcodeutils

 12
Author: Arunachalam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 19:28:35

Działa tylko ten skrypt, który zajmuje się nawet spacją w nazwach plików:

Edytuj

Zaktualizowano do obsługi plików swift i cocoapod. Domyślnie wyłącza katalog Pods i sprawdza tylko pliki projektu. Aby uruchomić, aby sprawdzić również folder Pods, Uruchom z --pod attrbiute:

/.finunusedimages.sh --pod

Oto rzeczywisty skrypt:

#!/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
 6
Author: ingaham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 09:34:56

Możesz stworzyć skrypt powłoki, który grep będzie twoim kodem źródłowym i porównać założone obrazy z folderem projektu.

Oto człowiek(ów) dla GREP oraz LS

Łatwo możesz zapętlić cały plik źródłowy, zapisać obrazy w tablicy lub coś podobnego i użyć

cat file.m | grep [-V] myImage.png

Dzięki tej sztuczce możesz przeszukiwać wszystkie obrazy w kodzie źródłowym projektu!!

Mam nadzieję, że to pomoże!
 2
Author: elp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 16:09:24

Napisałem skrypt lua, nie jestem pewien, czy mogę się nim podzielić, bo zrobiłem to w pracy, ale działa dobrze. Zasadniczo robi to:

Krok pierwszy - statyczne odniesienia do obrazów (Łatwy bit, pokryty innymi odpowiedziami)

  • rekurencyjnie przegląda dirs obrazów i wyciąga nazwy obrazów
  • usuwa nazwy obrazów .png i @2x (Nie Wymagane/używane w imageNamed:)
  • tekstowo wyszukuje każdą nazwę obrazu w plikach źródłowych (musi być wewnątrz łańcucha dosłowne)

Krok drugi-dynamiczne odniesienia do obrazów (The fun bit)

  • wyciąga listę wszystkich liter w źródle zawierających specyfikatory formatu (np.%@)
  • zastępuje w tych łańcuchach określone formaty wyrażeniami regularnymi (np. "foo%dbar" staje się "Foo[0-9]*bar"
  • tekstowo przeszukuje nazwy obrazów za pomocą łańcuchów regex

Następnie usuwa to, czego nie znalazł w żadnym z wyszukiwań.

The edge case is that image nazwy pochodzące z serwera nie są obsługiwane. Aby to zrobić, dołączamy kod serwera w tym wyszukiwaniu.

 2
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-02 15:04:41

Wprowadziłem bardzo niewielką modyfikację do doskonałej odpowiedzi dostarczonej przez @ EdMcManus do obsługi projektów wykorzystujących katalogi aktywów.

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

Naprawdę nie piszę skryptów bash, więc jeśli są jakieś ulepszenia, które mają być wprowadzone tutaj (prawdopodobnie) daj mi znać w komentarzach, a ja go zaktualizuję.

 2
Author: Stakenborg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 21:42:56

Użyłem tego frameworka: -

Http://jeffhodnett.github.io/Unused/

Działa cholernie dobrze! Tylko 2 miejsca, które widziałem problemy dotyczą, gdy nazwy obrazów są z serwera i gdy nazwa zasobu obrazu jest inna niż nazwa obrazu w folderze zasobu...

 2
Author: Swasidhant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 07:06:47

Możesz wypróbować aplikację FauxPas dla Xcode. To jest naprawdę dobre w ustaleniach brakujące obrazy i wiele innych problemów/ naruszeń związanych z projektem Xcode.

 1
Author: Kunal Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 17:53:23

Korzystając z innych odpowiedzi, ta jest dobrym przykładem, jak ignorować obrazy w dwóch katalogach i nie wyszukiwać wystąpień obrazów w plikach pbxproj lub xcassets (uważaj na ikonę aplikacji i ekrany powitalne). Zmień * w --ignore-dir=*.xcassets pasujące do katalogu:

#!/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
 1
Author: Gabriel Madruga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 14:07:11

Użyj http://jeffhodnett.github.io/Unused / aby znaleźć nieużywane obrazy.

 0
Author: Praveen Matanam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 11:41:41