Komenda file
może wykryć, jakie są dostępne w pliku typów binarnych.
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
Tak więc, jest to tylko kwestia odpowiedniego zastosowania funkcji wyszukiwania i filtrowania. Coś takiego powinno znaleźć wszystkie pliki binarne w systemie, które mają podsekcję PPC.
find/-perm -u+x ! -type d -exec file {} \; | grep ppc | awk '{print $1}'
Tylko PPC jest nieco trudniejsze. W tym celu będziesz chciał wykonać trzy polecenia, aby utworzyć 2 pliki w/tmp, pierwszy zawierający listę plików PPC, a drugi listę 32- lub 64-bitowych plików x86. Dogodnie "ppc" pasuje do ppc i 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
Następnie, sortowanie/Uniq nieco (tylko sortuje ścieżki i sprawia, że każdy binarny jest wymienione tylko raz):
cat /tmp/x86 | sort | uniq > /tmp/x86.filtered
cat /tmp/ppc | sort | uniq > /tmp/ppc.filtered
Następnie użycie diff (i nieco bardziej przetwarzanie) rzygać lista plików, które są jedynie ppc:
diff /tmp/ppc.filtered /tmp/x86.filtered | grep -e '<' | awk '{print $2}' | perl -p -e 's/:$//'
wynik końcowy powinien być lista plików, które zawierają tylko ppc wykonywalne sekcje Mach-o. Sugerowałbym zweryfikowanie listy przed nukingiem czegokolwiek.
Niektóre uwagi:
Wszystkie powyższe czynności są wykonywane w terminalu.
To tylko hack; działało dobrze na moim systemie i cieszę się, że pytasz, ponieważ chciałem to samo wiedzieć. Ale to tylko hack.
Poniższy wydaje się działać tylko w jednej linii, bez przechodzenia przez całą hierarchię pliku: mdfind -0 „kMDItemContentTypeTree == "public.executable" "| xargs -0 -n 1 sh -c 'lipo = "$ (lipo -info" $ 1 "2>/dev/null)"; jeśli [["$ lipo" == *: *: * ppc * && "$ lipo"! = *: *: * i386 * && "$ lipo"! = *: *: * x86_64 *]]; następnie echo "$ 1"; fi 'sh –
To mnie nie zaskakuje.Wszystkie powyższe kopiuj/wklej do * mojej * powłoki. * Twoja * powłoka może się różnić. :) Używam tcsh, btw. – bbum
Ponieważ 'file' wyświetla" 'dla architektury' ..." dla plików z wieloma architekturami, skorzystaj z tego, aby stworzyć łatwe do zrozumienia polecenie jednoliniowe, które działa nawet z ostatnimi wersjami OS X jak 10.11: 'find/-perm -u + x! -type d -exec plik {} \; | grep -v "dla arch" | grep ppc | cut -d: -f1' –