Polecenie „znajdź” w terminalu Mac: co oznacza podwójne ukośnik w wyniku?

9

Używam polecenia find do wyszukiwania w dużych i zagnieżdżonych strukturach katalogów.

Wynik-wynik zawiera czasem podwójny ukośnik (//).

Przykład (po „Pobraniu”):

#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf

Najpierw pomyślałem, że oznaczy bieżący katalog roboczy. Ale tak nie jest.

Jakie jest znaczenie tego podwójnego ukośnika?

Zwykle kopiuję wynik do schowka, przechodzę do wyszukiwarki. Następnie „Shift” + „Command” + „g” i wklejanie ścieżki (do pliku) do pola. Aby otwarty był katalog zawierający.

Działa w porządku. Ale podwójny ukośnik muszę usunąć ręcznie.

Dlatego: Jak mogę tego uniknąć?

mizech
źródło
2
Pamiętaj, że nie musisz usuwać podwójnego ukośnika. Podwójny ukośnik jest wyjątkowy tylko na początku ścieżki i tylko wtedy, gdy jest dokładnie dwoma ukośnikami. Wiele ukośników na środku lub na końcu lub dowolna liczba ukośników niż dokładnie dwa na początku odpowiadają dokładnie jednemu ukośnikowi. Gwarantuje to specyfikacja POSIX / SUS.
Jörg W Mittag

Odpowiedzi:

17

findjest raczej dosłowny. Kiedy każesz mu szukać w "~ / Downloads /", używa tego (w tym ukośnika) jako prefiksu dla tego, co znajdzie. Ponieważ na końcu ścieżki, którą mu podałeś, znajduje się niepotrzebny i nieistotny ukośnik, kończysz z niepotrzebnym i nieistotnym dodatkowym ukośnikiem w wyniku.

Rozwiązanie: usuń końcowe „/” z katalogu wyszukiwania:

#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf
#> find ~/Downloads -iregex ".*some.*"
/Users/michael/Downloads/subDirectory/some_file.pdf
Gordon Davisson
źródło
4

Jakie jest znaczenie tego podwójnego ukośnika?

Oznacza, że ​​używasz dziwnego starego znaleziska BSD.

Jak mogę tego uniknąć?

Rzeczywiście możesz pominąć końcowy ukośnik w swoim oryginalnym poleceniu, ale ponieważ jest on dodawany automatycznie poprzez uzupełnianie tabulatorami (które zdecydowanie powinieneś w jak największym stopniu wykorzystać), a ponieważ ukośnik końcowy jest faktycznie używany w wielu miejscach gdzie indziej, aby mieć pewność, że ma do czynienia z katalogiem, a nie nazwą pliku, pomijanie go jest sprzeczne z intuicją i głupie.

Zamiast tego sugeruję zrobienie jednej z tych innych rzeczy:

a) Zrób opakowanie, aby znaleźć rury do sed: | sed 's @ // @ / @'

b) Zainstaluj findutils GNU za pomocą „brew install findutils”, a następnie albo bezpośrednio użyj „gfind”, aliasu „find” na „gfind”, albo dodaj / usr / local / opt / findutils / libexec / gnubin do swojej ścieżki (co również dodaje GNU findutils „locate”, „updatedb” i „xargs”).

c) Przejdź na właściwy system operacyjny GNU / Linux, który nie miałby tego problemu (i tysiąca innych) w pierwszej kolejności. : p

Jan Kyu Peblik
źródło
1
Po prostu dodaj set mark-directories offdo swojego. inputrci możesz iść. Od jednego z tych starych facetów z BSD.
fd0,
@ fd0 wtedy nie można byłoby odróżnić katalogów od plików o tej samej nazwie; znalezisko BSD jest tutaj trochę chrupiące, nie bash ani readline
Jan Kyu Peblik,