Xcode 프로젝트에서 사용하지 않는 이미지를 찾을 수있는 한 줄이 있습니까? (모든 파일이 코드 또는 프로젝트 파일의 이름으로 참조된다고 가정하면 코드 생성 파일 이름이 없습니다.)
이 파일은 프로젝트의 수명 동안 쌓이는 경향이 있으며 주어진 png를 삭제해도 안전한지 알기 어려울 수 있습니다.
답변
프로젝트에 포함되어 있지 않지만 폴더에있는 파일의 경우
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
답변
이보다 강력한 솔루션입니다 – 그것은으로 확인 모든 텍스트 파일의 기본 이름을 참조. 스토리 보드 파일을 포함하지 않은 위의 솔루션에 유의하십시오 (완전히 이해할 수 있지만 당시에는 존재하지 않았습니다).
Ack는 이것을 매우 빠르게 만들지 만,이 스크립트가 자주 실행된다면 몇 가지 명백한 최적화가 있습니다. 예를 들어이 코드는 retina / non-retina 자산이 모두있는 경우 모든 기본 이름을 두 번 확인합니다.
#!/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
답변
LSUnusedResources를 사용해보십시오 .
jeffhodnett의 Unused에 크게 영향을 받지만 솔직히 Unused는 매우 느리고 결과가 완전히 정확하지는 않습니다. 그래서 성능을 최적화했습니다. 검색 속도가 미사용보다 빠릅니다.
답변
나는 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
답변
날씬한 것을 시도 하고 괜찮은 일을 할 수 있습니다 .
업데이트 : emcmanus 아이디어를 사용하여 컴퓨터에서 추가 설정을 피하기 위해 ack없이 작은 유틸리티를 만들었습니다.
답변
이 스크립트만이 파일 이름의 공간을 처리하는 나를 위해 작동합니다.
편집하다
지원에 업데이트 swift
파일과 cocoapod
. 기본적으로 Pod 디렉터리를 제외하고 프로젝트 파일 만 확인합니다. 실행하여 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
답변
자산 카탈로그를 활용하는 프로젝트를 처리하기 위해 @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 스크립트를 작성하지 않으므로 여기에서 개선해야 할 사항이 있으면 (아마도) 의견으로 알려 주시면 업데이트하겠습니다.