Odpowiedzi:
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.
file
wymagają od użytkownika podania ścieżki (np. BSD znajdź w OS X). Więc zwykle musisz wyraźnie powiedzieć coś takiego find . -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 to echo *
w katalogu, który zawiera tylko jeden lub dwa pliki, a zobaczysz, że .
nie ma go na liście. Dlatego find *
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:
$ find
or
$ find .
output:
./file1
./file2
./file3
Jeśli /tmp
katalog:
$ find /tmp
output:
/tmp/file4
/tmp/file5
Jeśli abc
katalog w bieżącym katalogu:
$ find abc
output:
abc/file6
abc/file7
Jeśli wiele katalogów w bieżącym katalogu:
$ find fu bar
output:
fu/file10
fu/file11
bar/file8
bar/file9
find
potrzebuję ścieżki do wyszukiwania czegokolwiek i że domyślnie jest to bieżący katalog. Pytanie brzmi, dlaczego wypisuje on wiodące, ./
gdy file.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 sposobu find
działania. I find zawsze domyślnie działa ze ścieżkami.
/tmp
, $PWD
to /tmp
nie jest ./
.
/tmp
, uruchom polecenie find /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łumaczenie
find .
, find $PWD
i find
(bez ścieżki, jeśli znalezisko to obsługuje).
find *
.