Jaka jest różnica między poleceniami find i findstr w systemie Windows?

24

Jakie są różnice w systemie Windows w komendach findi findstr?

Wygląda na to, że oba szukają tekstu w plikach:

odnaleźć

C:\> find /?
Searches for a text string in a file or files.

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         Displays all lines NOT containing the specified string.
  /C         Displays only the count of lines containing the string.
  /N         Displays line numbers with the displayed lines.
  /I         Ignores the case of characters when searching for the string.
  /OFF[LINE] Do not skip files with offline attribute set.
  "string"   Specifies the text string to find.
  [drive:][path]filename
             Specifies a file or files to search.

If a path is not specified, FIND searches the text typed at the prompt
or piped from another command.

findstr

C:\> findstr /?
Searches for strings in files.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         Matches pattern if at the beginning of a line.
  /E         Matches pattern if at the end of a line.
  /L         Uses search strings literally.
  /R         Uses search strings as regular expressions.
  /S         Searches for matching files in the current directory and all
             subdirectories.
  /I         Specifies that the search is not to be case-sensitive.
  /X         Prints lines that match exactly.
  /V         Prints only lines that do not contain a match.
  /N         Prints the line number before each line that matches.
  /M         Prints only the filename if a file contains a match.
  /O         Prints character offset before each matching line.
  /P         Skip files with non-printable characters.
  /OFF[LINE] Do not skip files with offline attribute set.
  /A:attr    Specifies color attribute with two hex digits. See "color /?"
  /F:file    Reads file list from the specified file(/ stands for console).
  /C:string  Uses specified string as a literal search string.
  /G:file    Gets search strings from the specified file(/ stands for console).
  /D:dir     Search a semicolon delimited list of directories
  strings    Text to be searched for.
  [drive:][path]filename
             Specifies a file or files to search.

Use spaces to separate multiple search strings unless the argument is prefixed
with /C.  For example, 'FINDSTR "hello there" x.y' searches for "hello" or
"there" in file x.y.  'FINDSTR /C:"hello there" x.y' searches for
"hello there" in file x.y.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

For full information on FINDSTR regular expressions refer to the online Command
Reference.
Prashant Bhate
źródło
1
Prawdopodobnie chodzi bardziej o ewolucję. Find wraca do czasów DOS / UNIX, a później FINDSTR został dodany w Windows. Oba prawdopodobnie ewoluowały i stały się bardziej podobne.
KCotreau,
Zgadzam się z linią czasu @ KCotreau: FIND jest starożytny, a FINDSTR jest nowszy. Wątpię, aby FIND ewoluował i stał się bardziej podobny do FINDSTR; raczej uważam, że FIND został zachowany jako okaleczony dinozaur, którym był (tak jak ogólnie DOS), aby zachować kompatybilność wsteczną (np. z plikami wsadowymi, które go używają), podczas gdy FINDSTR został dodany, aby zapewnić przyzwoity zestaw funkcji .
Scott
1
Aha, a tak przy okazji, polecenie FIND w systemie DOS / Windows nie jest podobne do findpolecenia Unix ; raczej, jak sugeruje paradroid poniżej, ZNAJDŹ jest jak rozwodniona wersja grep(a może fgrep).
Scott
nie widzisz różnic w pomocy?
phuclv

Odpowiedzi:

17

Jak pokazano powyżej, findstrdodaje obsługę wyrażeń regularnych, więc bardziej przypomina grep.

paradroid
źródło
3
Ale nie zawsze jest jasne dokładne użycie i różnica, jeśli nie korzystałeś z obu z nich często. Więc ich postrzeganie może być inne, ponieważ mogliście mieć znacznie inne doświadczenia niż oni. Część ogromnego problemu w nauce i karierze nazywam Luką Doświadczenia. Długa historia.
crosenblum
5

Findstr ma więcej opcji wyszukiwania i obsługuje wyrażenia regularne. Odkryłem, że findstr nie działa z symbolami wieloznacznymi w nazwie pliku.

Poniższe polecenie zwraca wszystkie wystąpienia ciągu wyszukiwania w wielu plikach ze wzorem Quant_2013-10-25 _ *. Log

find /I "nFCT255c9A" D:\Comp1\Logs\Quant_2013-10-25_*.log 

Następujące polecenie nic nie zwraca lub po prostu nie działa

findstr nFCT255c9A D:\Comp1\Logs\Quantum_2013-10-25_*.log
Val
źródło
findma również pewne ograniczenia. Na przykład nie można użyć go do dołączania numerów linii do każdej linii, ponieważ find/n""nic by nie pasowało. Do tego będziesz musiał użyćfindstr .
Pacerier,
1
Nie można odtworzyć problemu z symbolami wieloznacznymi w findstr. Microsoft Windows 7 Professional, 6.1.7601 Service Pack 1 Build 7601.
lordcheeto
1

findstr rozszerza funkcjonalność find o kilka przydatnych funkcji. Niektóre kluczowe dodatki obejmują

  1. findstr obsługuje wiele ciągów wyszukiwania
  2. findstr może pobierać jako dane wejściowe plik zawierający nazwy lub katalogi do przeszukania
  3. findstr obsługuje wyrażenie regularne

Żadna z tych funkcji nie jest odpowiednia dla dużych plików lub dużej liczby plików.

Chris McCowan
źródło