Jak znaleźć plik według nazwy pliku w terminalu Mac OSX?

118

Chcę znaleźć plik na moim Macbook z pliku: abc.dmg. Próbowałem użyć reflektora, ale go nie znalazłem. Kiedy próbowałem znaleźć i użyłem find -name abc.dmg -path /:, otrzymałem błędy z powrotem.

Jaka jest poprawna składnia do znalezienia pliku według nazwy pliku za pomocą polecenia find na terminalu Mac OSX?

SPRBRN
źródło
1
@VxJasonxV Pytania Apple są w 100% na temat dla superużytkowników i nie ma potrzeby, aby każde pytanie Apple było tam przenoszone. Pytania na iPhone'a lub iPada zostaną jednak przeniesione w razie potrzeby.
BinaryMisfit,
Nie był to powód do bycia poza tematem, ale fakt, że istnieje bardziej szczegółowy temat / strona dla tego ogólnego tematu.
VxJasonxV
@Diago: Czy była jakaś dyskusja na ten temat na meta lub czacie? Zastanawiam się, ponieważ AFAIK apple.SE wkrótce rozpocznie się w fazie beta, więc byłoby miło, gdyby wszyscy byli na tej samej stronie.
Robert S Ciaccio
1
@calavera. Dość stara dyskusja, ale istotna, można znaleźć tutaj . Apple SE, Ubuntu SE i Linux SE to wszystko, by uzupełnić Super User, ale w żaden sposób nie chcemy zmusić użytkowników do przeprowadzki. Wolę zadawać tutaj pytania Apple niż Apple, ponieważ używam 3 różnych systemów operacyjnych. Jeśli mam bardzo konkretne pytanie, zadam je na bardziej specjalistycznej stronie.
BinaryMisfit,

Odpowiedzi:

163

W najprostszej formie findprzyjmuje jeden parametr: ścieżkę. W swojej faktycznie użytecznej formie podąża ścieżką, po której następuje zawężenie kryteriów.

Dlatego chcesz:

  • find (program)
  • / (ścieżka) i
  • -name abc.dmg (kryteria).
find / -name abc.dmg
VxJasonxV
źródło
12
Podczas wyszukiwania na całym dysku mogą pojawić się błędy typu „odmowa uprawnień”, ale można je zignorować, chyba że spodziewasz się, że plik znajduje się w ograniczonym folderze. Jeśli tak, użyj sudo find / -name abc.dmg
Chris Nava
Próbowałem, ale bez rezultatu.
SPRBRN
6
Prawdopodobnie więc nie masz na komputerze pliku o nazwie abc.dmg. Możesz użyć -iname zamiast -name, aby rozróżnić wielkość liter w wyszukiwaniu. Bardzo wątpię, czy rzeczywiście szukasz słowa „abc.dmg”, a biorąc pod uwagę (przypuszczalnie) fakt, ciężko jest ci powiedzieć, na czym polega Twój problem bez podania rzeczywistych szczegółów.
VxJasonxV
2
@rxt: jeśli znaleźć nie można go znaleźć, nie ma go ...
Robert S Ciaccio
5
Biorąc pod uwagę, że raport PO próbował znaleźć w tekście pytania, warto zauważyć, że kolejność argumentów ma find znaczenie . Jeśli tak musi być find [path]+ [selection, grouping, and actions].
dmckee,
23

find . -name '*.csv'na przykład pracował dla mnie z symbolami wieloznacznymi. OP mógłby również użyć find . -name '*.dmg'do sprawdzenia swojego bieżącego katalogu, zakładając, że był w /.

pjammer
źródło
6

Możesz użyć locatepolecenia.

locate abc.dmg
Wuffers
źródło
2
Zanotuj osxtag. slocate db nie jest domyślnie wypełniany.
VxJasonxV
Próbowałem, po utworzeniu bazy danych, ale bez rezultatu.
SPRBRN
jeśli locatei mdfindoba zawiodą, prawdopodobnie plik nie znajduje się na twoim komputerze. Lub nie ma nazwy, jak myślisz, jak się nazywa. być może szukanie WSZYSTKICH DMG może być twoim następnym krokiem?
peelman
3

Najprostszym sposobem (jestem pewien, że już próbowałeś, ale hej, pozwól, że i tak dodam go do wątku) jest wprowadzenie abc.dmg w polu wyszukiwania w prawym górnym rogu dowolnego okna wyszukiwarki, a następnie wybierz „Plik” Nazwa ”z wyświetlonych opcji na pasku wyszukiwania.

Nie ma potrzeby terminala.

Pamiętaj również, że Spotlight indeksuje tylko katalogi określone w panelu sterowania Spotlight, a abc.dmg może nie znajdować się w jednym z tych katalogów.

Popraw mnie, jeśli się mylę, ale myślę, że polecenie find musi wiedzieć, co wypisać:

find / -name abc.dmg -print

... powinien wydrukować wszelkie wyniki na terminalu (w tym błędy uprawnień).

Jeśli nie chcesz błędów uprawnień i chcesz przeszukać inne katalogi użytkowników, to:

sudo find / -name abc.dmg -print
Jowisz
źródło
2

Możesz użyć następujących funkcji wiersza poleceń, aby szybko znaleźć i otworzyć odpowiedni plik. Uważam to za łatwiejsze niż wpisywanie długiego ciągu zapytania w oknie reflektora.

Dodaj następujące funkcje w ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Teraz albo source ~/.bash_aliasesotwórz nowe funkcje ładowania terminala. Aby wyszukać pliki zawierające słowa, ciasto i 2016 w dowolnym miejscu w nazwie pliku, wykonaj następujące czynności:

spot pie*2016 #or
spot 2016*pie

Nie ma potrzeby dodawania lub dołączania *do zapytania jako wzorca wyszukiwania, '*$1*'już oznacza on wpis wieloznacznej karty na początku i na końcu zapytania. Dodatkową wartością cdjest rozróżnianie wielkości liter i ignorowanie znaków diakrytycznych, np fred. Zwróci zarówno Frédéric, jak i FrEDeric.

findpaperograniczy wyszukiwanie do wyników pod określoną ścieżką (rekurencyjną), jednocześnie openpaper pie*201otworzy wynik wyszukiwania (lub pierwszy z wielu wyników) lub openpaper pie*201 3otworzy trzeci wpis wyników. Aby uniknąć otwierania skryptów bash lub innych plików innych niż dokumenty, możesz ograniczyć zawartość pliku przez dodatkowe atrybuty wyszukiwania. Zobacz Składnia wyrażenia zapytania o metadane i https://ss64.com/osx/mdfind.html, aby dowiedzieć się więcej o korzystaniu z innych operatorów wyszukiwania.

Samir
źródło
Niesamowite! Stilling it: D
Atcold
0

Przechwyć listę każdego pliku na dysku jako root z /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Cat cały plik przez grep, aby przeszukać cały dysk:

cat ~/file-list.txt | grep abc.dmg

Używaj wyrażeń regularnych, aby wyświetlać tylko pliki .jpg i .dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Wynik:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

...itp. Niestety przechwyci również wszystkie zamontowane dyski, więc najlepiej wysunąć te Time Machine, ponieważ mają wiele linków. Więc w innym oknie biegnę, watch tail -n 10 ~/file-list.txtco pokazuje mi, co się dzieje w moim nikczemnym hacku!

Tomachi
źródło
1
Złe praktyki lub rzeczy, które zasługują na komentarz: (1) sudo find / > ~/file-list.txtwydaje się lepsze niż uruchamianie całej powłoki jako root. (2) find *pominie ukryte (kropkowe) obiekty (jeśli istnieją) w /. (3) &>to bashism. (4) Bezużyteczne użycie cat. (5) grep abc.dmgwydrukuje np /foo/bar/123abcXdmg456/baz/whatever. // Jedną dobrą rzeczą, jaką twoja odpowiedź przynosi do tego wątku (a inna odpowiedź nie) jest podejście, w którym użytkownik uruchamia się findraz, a następnie wielokrotnie wykorzystuje zapisany wynik bez ponownego sprawdzania systemu (-ów) plików. Ta potencjalna zaleta nie jest jednak akcentowana.
Kamil Maciorowski
Dobrym punktem dzięki Kamil, zrobili to i również chown $ (whoami)
Tomachi