Niedawno otrzymałem ten find
linijka, ale nie jestem w stanie wyjaśnić, skąd bierze się różnica między dwoma poniżej:
Przykład 1
[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;
./names:Madison Randy:300:Product Development
Przykład 2
[root@centos share]# find . -exec grep -i "madis" {} \;
Madison Randy:300:Product Development
Jak widać, w pierwszym znajduje się konkretny plik, z którego pochodzi ten ciąg i jak dotąd naprawdę nie jestem w stanie dowiedzieć się, dlaczego tak się dzieje.
/dev/null
upewnienie się, że to, co jest grep-ed, nie zostanie znalezione w (pustym)/dev/null
pliku, więc wyświetlane są tylko poprawne lokalizacje”/dev/null
, nie marnujesz czasu na przeszukiwanie niepustego pliku fikcyjnego. I wreszcie cel poszukiwań/dev/null
jest oczywisty dla osób zaznajomionych z tym idiomem.man grep
:Różnica wynika z wywołania grep z jednym lub dwoma argumentami pliku w obu przypadkach. Zamiast dodawać
/dev/null
możesz zadzwonićgrep
z argumentem-H
. Być może/dev/null
zachowanie jest szerzej obsługiwane.źródło
grep -H
nie jest przenośny -/dev/null
sztuczka działa bez GNU grep.Pierwszy przykład jest równoważny z uruchomieniem grep na dwóch plikach dla każdego pliku znalezionego w wyniku
find
wyrażenia. Na przykład, jeślifind
znajdzie trzy plikia.txt
,b.txt
ac.txt
następniegrep
uruchomi się jakoDo którego
grep
zostanie wyświetlona nazwa pliku, do którego pasuje wyjście. Ponieważ nic nie będzie pasować do / dev / null, gwarantuje się, że nazwa pierwszego pliku zostanie wydrukowana, jeśli będzie pasować.Natomiast drugi przykład jest równoważny z
W takim przypadku nazwa pliku nie zostanie wydrukowana dla dopasowań, ponieważ istnieje tylko jeden argument.
źródło