Znajdź wszystkie pliki wykonywalne w folderze w terminalu

19

Mam folder myfolderzawierający ogromną hierarchię plików / folderów.
Jak znaleźć wszystkie pliki wykonywalne w tym folderze?

W Ubuntu działa to: find . -executable -type f

Ale Mac OS X Mavericks (który również używa bash) nie może go uzyskać:

find: -executable: unknown primary or operator
Nicolas Raoul
źródło

Odpowiedzi:

30

Znajduje to wszystkie pliki (nie dowiązania symboliczne) z zestawem bitów wykonywalnych:

find . -perm +111 -type f

Znajdziesz tu również dowiązania symboliczne (które są często równie ważne)

find . -perm +111 -type f -or -type l

Oto jak działa polecenie, jeśli nie jest oczywiste:

  • find jest oczywiście program znajdujący (:
  • .odnosi się do katalogu, w którym rozpocznie się wyszukiwanie (( .bieżący katalog)
  • -perm +111= z dowolnym zestawem bitów wykonywalnych ( +oznacza „dowolny z tych bitów”, 111jest ósemką dla bitu wykonywalnego dla właściciela, grupy i kogokolwiek)
  • -type foznacza, że ​​typ jest plikiem
  • -or boolean OR
  • -type loznacza, że ​​typ jest dowiązaniem symbolicznym
drfrogsplat
źródło
2
Można użyć -Lzamiast -or -type lpowodować żadnych statpołączeń wykonanych przez findzwrócić statystyk pliku związana, a nie sam związek.
Ian C.
Problem, który znalazłem w tym podejściu, polega na tym, że każdy plik może mieć uprawnienia do uruchamiania. Na przykład po pobraniu pliku tekstowego z systemu Windows uprawnienia są pomieszane.
Ivan Z. Xiao
5

Nie mogłem sprawić, by odpowiedź Iana zadziałała (10.6.8), ale następujące wyniki dały oczekiwane rezultaty:

find . -type f -perm +0111 -print

edytuj aktualizację

To też wydaje się działać!

find . -type f -perm +ugo+x -print

Myślę, że „x” nie ma znaczenia bez użytkownika / grupy / innych specyfikatorów.

Kent
źródło
Składnia symboliczna musi być nowa - dziękuję za zwrócenie na to uwagi. Zaktualizowałem odpowiedź, więc używa ósemek i jest wstecznie kompatybilny ze starszymi wersjami OS X.
Ian C.
Co dziwne, ta część strony podręcznika 10.6 jest dokładnie taka sama, jak to, co zacytowałeś ... co wystarczyło, abym zaczął kopać trochę głębiej i zobaczyć, co się do cholery dzieje. Zmieniłem moją odpowiedź powyżej.
Kent
2
Wniosek: składnia polecenia BDS jest dziwna.
Ian C.
3

Ze strony podręcznika użytkownika w OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

Potrzebujesz więc:

find . -type f -perm +0111 -print

Pamiętaj, że OS X jest oparty na BSD , a nie na Linuksie, więc polecenia Gnu, do których przywykłeś w dystrybucjach Linuksa (z których findjest jedną z nich), niekoniecznie są takie same jak w OS X. To nie jest różnica powłoki, to różnica w systemie operacyjnym / narzędziach systemu operacyjnego.

Ian C.
źródło
1

Wiem, że to bardzo stare pytanie, ale szukając rozwiązania, mogłem znaleźć lepszą odpowiedź.

Główny problem z użyciem „znajdź” polega na tym, że polega on na zestawie atrybutów wykonywalnym, nawet jeśli ten atrybut jest ustawiony dla pliku niewykonywalnego.

MacOS jest wyposażony w poręczne małe narzędzie wiersza polecenia „ file”, które wyświetla informacje o pliku, na przykład:

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

Jak widać, „MyProgram” jest plikiem wykonywalnym i jako taki jest ładnie oznaczony. Ponieważ stare 32-bitowe pliki wykonywalne również będą miały w tym wyrażeniu „plik wykonywalny”, poniższe elementy powinny zawierać wszystkie prawdziwe pliki wykonywalne (pliki binarne):

file * | grep "executable"

Mam nadzieję, że przyda się to również osobom szukającym odpowiedzi na to samo pytanie.

Uwaga: filewydaje się, że nie ma funkcji rekurencji w podkatalogach.

Hanzaplastique
źródło