題 Linux grep或查找用法


如何在我的硬盤上找到一個以。開頭的文件 io_file

我試過了:

grep -r io_file*` 

find -name io_file*

find 什麼都沒有回來 grep 似乎需要很長時間沒有任何結果。

我究竟做錯了什麼?


4
2017-08-11 19:41


起源


grep和find不是為了同一件事。
(湯姆和海報不一樣)
實交實實件實件件件實件件交件實件件實件交實件實件交實交件實實件實件交交實實件件件實實實件件件實件件交件實交件實件件件交件件似實件件件實件實實似件實件似件實件實件件件似實件件實似件件件件 ACK。這是一個Perl工具,它具有更簡單的界面,包含find和grep的主要功能。 - Yuval F


答案:


find / -name 'io_file*'

第一個參數將指定搜索應從何處開始。 / 意味著你的整個硬盤。要僅搜索當前目錄(和子目錄),請使用: find .

如果搜索字符串包含shell元字符(例如星號),則必須引用該字符串。否則,它將被shell解析,從未見過 find


11
2017-08-11 19:43



不完全正確。搜索字符串只會被展開 如果有匹配,否則它是未展開的。例如,嘗試“echo thisisnotafile *”。 - JesperE
Jesper:這是依賴shell的行為嗎?我正在使用的終端使用tcsh,即使對於不可擴展的文件名,引用也有所不同。
感謝那。我怎麼能說我想查看當前目錄AS WELL AS所有子目錄?
只需將'/'更改為'。' (沒有引號)(再次,不是海報)
@John Millikin:確實,bash和tcsh有不同的行為。 - Bastien Léonard


find / -name 'io_file*' -type f 2>/dev/null



   /: Start looking from root directory

   -type f: Only search for regular files

    2>/dev/null: Redirect errors to /dev/null. (handy if you are not root and
                 not interested in all the "access denied" messages)

請記住,grep和find會做不同的事情。

grep的  搜索命名輸入文件   (如果沒有文件,則為標準輸入          對於包含匹配項的行,命名或給出文件名   該          鑑於PATTERN。默認情況下,grep打印匹配的行。

  - 搜索目錄中的文件   等級制度


7
2017-08-11 19:43



-name pattern不要忘記將模式用引號括起來,以防止它被shell擴展。
那是來自查找手冊頁
@jcolebrand nope - Tom


IMO,使用find對整個硬盤搜索來說很慢(當訪問你不擁有的文件時,它也會顯示許多權限錯誤)。如果可能,請使用locate:

locate -b 'io_file*'

如果文件比24h更新,你可能需要重新索引(通常它設置每日cronjob):

sudo updatedb

4
2017-08-11 19:46





find / -name 'io_file*'

2
2017-08-11 19:43





命令

# set -x

將在shell擴展後打印命令,以便您可以看到正在發生的事情

# find . -name letter.*
+ find . -name letter.rtf

...現在你可以看到shell正在將參數擴展為name letter.rtf,因為我目前的driectory包含一個名為的文件 letter.rtf 與模式匹配。

引用模式(在這種情況下雙引號也起作用)將停止shell擴展

# find . -name 'letter.*'
+ find . -name 'letter.*'

要關閉它,請使用

# set +x

你也可以使用 -x 在...上 shebang線 看看哪些shell腳本正在做什麼可以極大地幫助調試。

#!/bin/bash -x

2
2017-08-11 20:45





shell擴展通配符並將結果傳遞給grep,因此你需要轉義 * 或使用引號:

find / -name io_file\*
find / -name 'io_file*'
find / -name "io_file*"

所有這三個在我的Linux機器上做同樣的事情。


0
2017-08-11 19:46





find -name io_file* 將僅在當前目錄及以下搜索。如果要搜索整個硬盤,則需要指定路徑: find / -name io_file*。同樣的事情 grep -r;它只會在當前目錄及以下搜索。

find 實用程序非常方便,但使用它可能有點違反直覺。我的建議是你閱讀發現手冊頁(man find),值得投入的時間。


0
2017-08-11 19:47





因為你沒有給 grep的 一個文件,它在標準輸入上運行,等待你輸入內容。無論如何,這是錯誤的命令。至於  你需要一個目錄來開始並且必須放 io_file* 在引號中,否則它會被shell擴展:

find / -name "io_file*"

你也可以使用 locate "io_file*" 哪個更快但可能不准確。


0
2017-08-11 19:48