Dlaczego find
drukuje prowadzące ./
do wyników, jeśli nie podano ścieżek?
$ find
./file1
./file2
./file3
Jaki jest powód, aby tego nie drukować?
$ find
file1
file2
file3
Powód dlaczego widzisz to dlatego, że deweloper GNU wybrał , aby zapewnić „rozsądne” zachowanie dla gdy żaden nie został podany. Natomiast POSIX nie stwierdza, że parametr jest opcjonalny:find
find
find
Narzędzie musi rekurencyjnie schodzą hierarchii katalogów z każdego pliku określonego przez ścieżkę , oceny logicznego, złożoną z barw podstawowych opisanych w sekcji operandów dla każdego pliku spotykanych. Każdy argument ścieżki jest oceniany w niezmienionej postaci, w tym w jakiej został dostarczony, w tym wszystkie<slash>
znaki końcowe ; wszystkie nazwy ścieżek dla innych plików napotkanych w hierarchii składają się z konkatenacji bieżącego argumentu ścieżki, a<slash>
jeśli bieżący argument ścieżki nie kończy się na jednym, i nazwy pliku względem argumentu ścieżki. Część względna nie powinna zawierać żadnych kropek ani elementów kropka-kropka, brak spływuznaki i tylko pojedyncze<slash>
znaki między komponentami ścieżki.
Możesz zobaczyć różnicę w streszczeniu każdego z nich. GNU ma (zgodnie z konwencją) elementy opcjonalne w nawiasach kwadratowych:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
[expression]
podczas gdy POSIX nie wskazuje, że może być opcjonalny:
find [-H|-L] path... [operand_expression...]
W programie GNU odbywa się to w ftsfind.c
:
jeśli (pusty) { / * * Używamy tutaj zmiennej tymczasowej, ponieważ niektóre akcje się zmieniają * ścieżka tymczasowo. Dlatego jeśli użyjemy stałej ciągu, * otrzymujemy rdzeń rdzeniowy. Najlepszym tego przykładem jest powiedzmy * „find -printf% H” (uwaga, a nie „find. -printf% H”). * / char defaultpath [2] = "."; return find (defaultpath); }
i "."
dla uproszczenia stosuje się literał . Dzięki temu zobaczysz ten sam wynik
find
i
find .
ponieważ (i POSIX się zgadza) podana ścieżka zostanie użyta do prefiksu wyników (patrz powyżej konkatenacja ).
Przy odrobinie pracy można było ustalić, kiedy funkcja została dodana po raz pierwszy; był obecny przy tworzeniu „findutils” w 1996 r. (patrz find.c
):
+ /* If no paths are given, default to ".". */
+ for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+ process_top_path (argv[i]);
+ if (i == 1)
+ process_top_path (".");
+
+ exit (exit_status);
+}
Z dziennika zmian dla znalezienia 3.8 było to najwyraźniej
Sat Dec 15 19:01:12 1990 David J. MacKenzie (djm at egypt)
* find.c (main), util.c (usage): Make directory args optional,
defaulting to "."
Zwykle wykonuje się przetwarzanie końcowe plików, a w takim przypadku rozpoczęcie nazwy pliku może być ogromną zaletą ./
. W szczególności, jeśli nazwa pliku zaczyna się od -
, kolejne polecenie może zinterpretować tę nazwę pliku jako opcję. ./
unika tego.
Jako przykład rozważmy katalog z tymi plikami:
$ ls
--link --no-clobber
Teraz wyobraź sobie, jak to polecenie zadziałałoby, gdyby nazwy plików zostały podane bez znaku z ./
przodu:
$ find -type f -exec cp -t ../ {} +
Możemy zilustrować problem find
sam w sobie. Uruchommy go w tym samym katalogu, co powyżej. Następujące prace:
$ find ./*
./--link
./--no-clobber
Następujące niepowodzenie:
$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.
find *
.file
wymagają od użytkownika podania ścieżki (np. BSD znajdź w OS X). Więc zwykle musisz wyraźnie powiedzieć coś takiegofind . -type f ...
. Stąd nie jest wielkim krokiem dla niektórych wersji find (jak GNU find), aby po prostu domyślnie.
pozostawił wszystko inne bez zmian .find *
nie pokazano,.
jest to, że*
wyświetla listę wszystkich plików i folderów, ale wyklucza.
. Zrób toecho *
w katalogu, który zawiera tylko jeden lub dwa pliki, a zobaczysz, że.
nie ma go na liście. Dlategofind *
działa na każdym rozwiniętym pliku. To tak, jakbyś powiedziałfind Desktop/
z katalogu domowego. Zobaczysz wynik jakoDesktop/foo_bar.txt
find
zachowuje. Czy masz jakieś wiarygodne informacje referencyjne na poparcie dorozumianego twierdzenia, które z tego powodufind
zostało zaprojektowane w taki sposób ?find
Ścieżka potrzeby dowodzenia (s), aby wyszukanie. Jeśli nie podamy żadnych, użyje bieżącego katalogu (.
) jako punktu początkowego. Podobnie, jeśli miniesz ścieżkę, np/tmp
. Uważa to za swój punkt początkowy. A zatem wyniki.Jeśli bieżący katalog:
Jeśli
/tmp
katalog:Jeśli
abc
katalog w bieżącym katalogu:Jeśli wiele katalogów w bieżącym katalogu:
źródło
find
potrzebuję ścieżki do wyszukiwania czegokolwiek i że domyślnie jest to bieżący katalog. Pytanie brzmi, dlaczego wypisuje on wiodące,./
gdyfile.txt
jest taki sam jak./file.txt
.Jeśli nie podasz ścieżki,
find
polecenie przyjmuje${PWD}
ścieżkę i wypisuje ją na wyjściu. Użytkownik nieokreślający ścieżki nie zmienia sposobufind
działania. I find zawsze domyślnie działa ze ścieżkami.źródło
/tmp
,$PWD
to/tmp
nie jest./
./tmp
, uruchom poleceniefind /tmp
Jeśli nie podasz ścieżki, zawsze będzie to katalog bieżący, czyli./
/tmp
. Po prostu nie może być$PWD
.${PWD}
za niepoprawne tłumaczeniefind .
,find $PWD
ifind
(bez ścieżki, jeśli znalezisko to obsługuje).