2009-09-10 4 views
5

¿Tiene algún puntero sobre cómo escribir un script que buscará en mi sistema las aplicaciones, bibliotecas (es decir,/usr/local/lib y/usr/local) y binarios que son solo PPC?Buscar todas las bibliotecas, binarios y aplicaciones de PPC en Snow Leopard

Actualicé mi sistema de una Mac PPC a una Mac Intel con Leopard 10.5. Luego me actualicé a Snow Leopard 10.6 que no viene con Rosetta. ¡Así que ahora solo me estoy dando cuenta de todas las cosas antiguas de PPC que quedan en mi sistema!

Respuesta

9

El comando file puede detectar qué tipos binarios están disponibles en un archivo.

file -b /usr/bin/atrm 
setuid Mach-O universal binary with 3 architectures 
/usr/bin/atrm (for architecture x86_64): Mach-O 64-bit executable x86_64 
/usr/bin/atrm (for architecture i386): Mach-O executable i386 
/usr/bin/atrm (for architecture ppc7400): Mach-O executable ppc 

Entonces, solo se trata de usar el método de búsqueda y filtrado de forma adecuada. Algo así debería encontrar todos los binarios en el sistema que tienen una subsección de PPC.

find/-perm -u+x ! -type d -exec file {} \; | grep ppc | awk '{print $1}' 

PPC solo es un poco más difícil. Para eso, querrá hacer tres comandos para crear 2 archivos en/tmp, el primero con una lista de archivos PPC y el segundo una lista de archivos x86 de 32 o 64 bits. Convenientemente, 'ppc' coincide con ppc y ppc64.

find/-perm -u+x ! -type d -exec file {} \; | grep ppc | awk '{print $1}' > /tmp/ppc 
find/-perm -u+x ! -type d -exec file {} \; | grep i386 | awk '{print $1}' > /tmp/x86 
find/-perm -u+x ! -type d -exec file {} \; | grep x86_64 | awk '{print $1}' >> /tmp/x86 

A continuación, ordene/UniQ un poco (solo ordena los caminos y se asegura de cada binario solamente aparece una vez):

cat /tmp/x86 | sort | uniq > /tmp/x86.filtered 
cat /tmp/ppc | sort | uniq > /tmp/ppc.filtered 

Entonces, el uso de diff (y un poco más procesamiento) para vomitar la lista de archivos que son sólo ppc:

diff /tmp/ppc.filtered /tmp/x86.filtered | grep -e '<' | awk '{print $2}' | perl -p -e 's/:$//' 

el resultado final debe ser una lista de archivos que sólo contienen secciones mach-o ejecutables ppc. Sugeriría verificar la lista antes de desconectar cualquier cosa.

Algunas notas:

Todo lo anterior se realiza en el terminal.

Esto es solo un truco; funcionó muy bien en mi sistema y me alegro de que lo haya preguntado porque quería saber lo mismo. Pero es solo un truco.

+2

El siguiente parece funcionar en una sola línea, sin recorrer toda la jerarquía de archivos: mdfind -0 'kMDItemContentTypeTree == "public.executable" '| xargs -0 -n 1 sh -c 'lipo = "$ (lipo -info" $ 1 "2>/dev/null)"; if [["$ lipo" == *: *: * ppc * && "$ lipo"! = *: *: * i386 * && "$ lipo"! = *: *: * x86_64 *]]; luego repite "$ 1"; fi 'sh –

+0

Eso no me sorprende.Todo lo anterior copia/pega en * my * shell. * Su * shell puede variar. :) Estoy usando tcsh, por cierto. – bbum

+0

Dado que 'file' muestra" 'for architecture' ..." para archivos con varias arquitecturas, aproveche para hacer un comando de una línea fácil de entender que incluso funciona con versiones recientes de OS X como 10.11: 'find/-perm -u + x! -type d -exec file {} \; | grep -v 'para arco' | grep ppc | cut -d: -f1' –

1

También tenga en cuenta que Rosetta viene con 10.6, es solo una de las instalaciones opcionales. Verifique el DVD que utilizó para instalarlo.

+0

También puede instalarlo desde Internet si elige instalarlo cuando intenta ejecutar una aplicación PPC. – Bavo

0

De hecho, debería pedirle que lo instale cuando intente iniciar una de esas aplicaciones.

3

Para encontrar aplicaciones, puede usar System Profiler (Información del sistema llamado en Lion).

Busque en "Software" en la barra lateral y seleccione "Aplicaciones" ... luego espere un largo tiempo mientras recopila información.

+1

Para aclarar: a continuación, puede ordenar la lista por "Tipo", que enumerará todas las aplicaciones PPC juntas. – beporter

+0

Correcto. Olvidé ese paso. ':-)' –

+0

Se llama "Información del sistema" en Mavericks y más tarde también. –

2

Sobre la base de la respuesta de Kevin Ballard, esto se trabaja en Mountain Lion:

mdfind -0 'kMDItemContentTypeTree == "public.executable"' | xargs -0 -n 1 sh -c 'lipo="$(lipo -info "$1" 2>/dev/null)"; if [[ "$lipo" == *ppc* && "$lipo" != *i386* && "$lipo" != *x86_64* ]]; then echo "$1"; fi' sh 
Cuestiones relacionadas