<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 6.5 指令與文件的搜尋 文件的搜尋可就厲害了!因為我們常常需要知道那個文件放在哪里,才能夠對該文件進行一些修改或維護等動作。 有些時候某些軟件配置文件的文件名是不變的,但是各 distribution 放置的目錄則不同。 此時就得要利用一些搜尋指令將該配置文件的完整文件名捉出來,這樣才能修改嘛!您說是吧!^_^ ### 6.5.1 指令文件名的搜尋 我們知道在終端機模式當中,連續輸入兩次[tab]按鍵就能夠知道使用者有多少指令可以下達。 那你知不知道這些指令的完整文件名放在哪里?舉例來說,ls 這個常用的指令放在哪里呢? 就通過 which 或 type 來找尋吧! * which (尋找“可執行文件”) ``` [root@study ~]# which [-a] command 選項或參數: -a :將所有由 PATH 目錄中可以找到的指令均列出,而不止第一個被找到的指令名稱 范例一:搜尋 ifconfig 這個指令的完整文件名 [root@study ~]# which ifconfig /sbin/ifconfig 范例二:用 which 去找出 which 的文件名為何? [root@study ~]# which which alias which='alias &#124; /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' /bin/alias /usr/bin/which # 竟然會有兩個 which ,其中一個是 alias 這玩意兒呢!那是啥? # 那就是所謂的“命令別名”,意思是輸入 which 會等于后面接的那串指令啦! # 更多的數據我們會在 bash 章節中再來談的! 范例三:請找出 history 這個指令的完整文件名 [root@study ~]# which history /usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin) [root@study ~]# history --help -bash: history: --: invalid option history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg # 瞎密?怎么可能沒有 history ,我明明就能夠用 root 執行 history 的啊! ``` 這個指令是根據“[PATH](../Text/index.html#dir_path)”這個環境變量所規范的路徑,去搜尋“可執行文件”的文件名~ 所以,重點是找出“可執行文件”而已!且 which 后面接的是“完整文件名”喔!若加上 -a 選項,則可以列出所有的可以找到的同名可執行文件,而非僅顯示第一個而已! 最后一個范例最有趣,怎么 history 這個常用的指令竟然找不到啊!為什么呢?這是因為 history 是“bash 內置的指令”啦! 但是 which 默認是找 PATH 內所規范的目錄,所以當然一定找不到的啊(有 bash 就有 history!)!那怎辦?沒關系!我們可以通過 type 這個指令喔! 關于 type 的用法我們將在 [第十章的 bash](../Text/index.html#bash_type) 再來談! ### 6.5.2 文件文件名的搜尋 再來談一談怎么搜尋文件吧!在 Linux 下面也有相當優異的搜尋指令呦!通常 find 不很常用的!因為速度慢之外, 也很操硬盤!一般我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦! 為什么呢?因為 whereis 只找系統中某些特定目錄下面的文件而已,locate 則是利用數據庫來搜尋文件名,當然兩者就相當的快速, 并且沒有實際的搜尋硬盤內的文件系統狀態,比較省時間啦! * whereis (由一些特定的目錄中尋找文件文件名) ``` [root@study ~]# whereis [-bmsu] 文件或目錄名 選項與參數: -l :可以列出 whereis 會去查詢的幾個主要目錄而已 -b :只找 binary 格式的文件 -m :只找在說明文檔 manual 路徑下的文件 -s :只找 source 來源文件 -u :搜尋不在上述三個項目當中的其他特殊文件 范例一:請找出 ifconfig 這個文件名 [root@study ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz 范例二:只找出跟 passwd 有關的“說明文檔”文件名(man page) [root@study ~]# whereis passwd # 全部的文件名通通列出來! passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz [root@study ~]# whereis -m passwd # 只有在 man 里面的文件名才抓出來! passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz ``` 等一下我們會提到 find 這個搜尋指令, find 是很強大的搜尋指令,但時間花用的很大!(因為 find 是直接搜尋硬盤,為如果你的硬盤比較老舊的話,嘿嘿!有的等!) 這個時候 whereis 就相當的好用了!另外, whereis 可以加入選項來找尋相關的數據,例如,如果你是要找可可執行文件 (binary) 那么加上 -b 就可以啦! 如果不加任何選項的話,那么就將所有的數據列出來啰! 那么 whereis 到底是使用什么咚咚呢?為何搜尋的速度會比 find 快這么多? 其實那也沒有什么,只是因為 whereis 只找幾個特定的目錄而已~并沒有全系統去查詢之故。所以說,whereis 主要是針對 /bin /sbin 下面的可執行文件, 以及 /usr/share/man 下面的 man page 文件,跟幾個比較特定的目錄來處理而已。所以速度當然快的多!不過,就有某些文件是你找不到的啦! 想要知道 whereis 到底查了多少目錄?可以使用 whereis -l 來確認一下即可! * locate / updatedb ``` [root@study ~]# locate [-ir] keyword 選項與參數: -i :忽略大小寫的差異; -c :不輸出文件名,僅計算找到的文件數量 -l :僅輸出幾行的意思,例如輸出五行則是 -l 5 -S :輸出 locate 所使用的數據庫文件的相關信息,包括該數據庫紀錄的文件/目錄數量等 -r :后面可接正則表達式的顯示方式 范例一:找出系統中所有與 passwd 相關的文件名,且只列出 5 個 [root@study ~]# locate -l 5 passwd /etc/passwd /etc/passwd- /etc/pam.d/passwd /etc/security/opasswd /usr/bin/gpasswd 范例二:列出 locate 查詢所使用的數據庫文件之文件名與各數據數量 [root@study ~]# locate -S Database /var/lib/mlocate/mlocate.db: 8,086 directories # 總紀錄目錄數 109,605 files # 總紀錄文件數 5,190,295 Bytes in file names 2,349,150 Bytes used to store database ``` 這個 locate 的使用更簡單,直接在后面輸入“文件的部分名稱”后,就能夠得到結果。 舉上面的例子來說,我輸入 locate passwd ,那么在完整文件名 (包含路徑名稱) 當中,只要有 passwd 在其中, 就會被顯示出來的!這也是個很方便好用的指令,如果你忘記某個文件的完整文件名時~~ 但是,這個東西還是有使用上的限制呦!為什么呢?你會發現使用 locate 來尋找數據的時候特別的快, 這是因為 locate 尋找的數據是由“已創建的數據庫 /var/lib/mlocate/” 里面的數據所搜尋到的,所以不用直接在去硬盤當中存取數據,呵呵!當然是很快速啰! 那么有什么限制呢?就是因為他是經由數據庫來搜尋的,而數據庫的創建默認是在每天執行一次 (每個 distribution 都不同,CentOS 7.x 是每天更新數據庫一次!),所以當你新創建起來的文件, 卻還在數據庫更新之前搜尋該文件,那么 locate 會告訴你“找不到!”呵呵!因為必須要更新數據庫呀! 那能否手動更新數據庫哪?當然可以啊!更新 locate 數據庫的方法非常簡單,直接輸入“ updatedb ”就可以了! updatedb 指令會去讀取 /etc/updatedb.conf 這個配置文件的設置,然后再去硬盤里面進行搜尋文件名的動作, 最后就更新整個數據庫文件啰!因為 updatedb 會去搜尋硬盤,所以當你執行 updatedb 時,可能會等待數分鐘的時間喔! * updatedb:根據 /etc/updatedb.conf 的設置去搜尋系統硬盤內的文件名,并更新 /var/lib/mlocate 內的數據庫文件; * locate:依據 /var/lib/mlocate 內的數據庫記載,找出使用者輸入的關鍵字文件名。 * find ``` [root@study ~]# find [PATH] [option] [action] 選項與參數: 1\. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明 -mtime n :n 為數字,意義為在 n 天之前的“一天之內”被更動過內容的文件; -mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的文件文件名; -mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的文件文件名。 -newer file :file 為一個存在的文件,列出比 file 還要新的文件文件名 范例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的文件列出 [root@study ~]# find / -mtime 0 # 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前, # 有變動過內容的文件都會被列出來!那如果是三天前的 24 小時內? # find / -mtime 3 有變動過的文件都被列出的意思! 范例二:尋找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出 [root@study ~]# find /etc -newer /etc/passwd # -newer 用在分辨兩個文件之間的新舊關系是很有用的! ``` 時間參數真是挺有意思的!我們現在知道 atime, ctime 與 mtime 的意義,如果你想要找出一天內被更動過的文件名稱, 可以使用上述范例一的作法。但如果我想要找出“4天內被更動過的文件文件名”呢?那可以使用“ find /var -mtime -4 ”。那如果是“4天前的那一天”就用“ find /var -mtime 4 ”。有沒有加上“+, -”差別很大喔!我們可以用簡單的圖示來說明一下: ![find 相關的時間參數意義](https://box.kancloud.cn/2016-05-13_57357373102e4.gif)圖6.5.1、find 相關的時間參數意義 圖中最右邊為目前的時間,越往左邊則代表越早之前的時間軸啦。由圖 6.5.1 我們可以清楚的知道: * +4代表大于等于5天前的文件名:ex&gt; find /var -mtime +4 * -4代表小于等于4天內的文件文件名:ex&gt; find /var -mtime -4 * 4則是代表4-5那一天的文件文件名:ex&gt; find /var -mtime 4 非常有趣吧!你可以在 /var/ 目錄下搜尋一下,感受一下輸出文件的差異喔!再來看看其他 find 的用法吧! ``` 選項與參數: 2\. 與使用者或群組名稱有關的參數: -uid n :n 為數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在 /etc/passwd 里面與帳號名稱對應的數字。這方面我們會在第四篇介紹。 -gid n :n 為數字,這個數字是群組名稱的 ID,亦即 GID,這個 GID 記錄在 /etc/group,相關的介紹我們會第四篇說明~ -user name :name 為使用者帳號名稱喔!例如 dmtsai -group name:name 為群組名稱喔,例如 users ; -nouser :尋找文件的擁有者不存在 /etc/passwd 的人! -nogroup :尋找文件的擁有群組不存在于 /etc/group 的文件! 當你自行安裝軟件時,很可能該軟件的屬性當中并沒有文件擁有者, 這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。 范例三:搜尋 /home 下面屬于 dmtsai 的文件 [root@study ~]# find /home -user dmtsai # 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有文件時, # 就可以利用這個指令將屬于某個使用者的所有文件都找出來喔! 范例四:搜尋系統中不屬于任何人的文件 [root@study ~]# find / -nouser # 通過這個指令,可以輕易的就找出那些不太正常的文件。如果有找到不屬于系統任何人的文件時, # 不要太緊張,那有時候是正常的~尤其是你曾經以源代碼自行編譯軟件時。 ``` 如果你想要找出某個使用者在系統下面創建了啥咚咚,使用上述的選項與參數,就能夠找出來啦! 至于那個 -nouser 或 -nogroup 的選項功能中,除了你自行由網絡上面下載文件時會發生之外, 如果你將系統里面某個帳號刪除了,但是該帳號已經在系統內創建很多文件時,就可能會發生無主孤魂的文件存在! 此時你就得使用這個 -nouser 來找出該類型的文件啰! ``` 選項與參數: 3\. 與文件權限及名稱有關的參數: -name filename:搜尋文件名稱為 filename 的文件; -size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的文件。這個 SIZE 的規格有: c: 代表 Byte, k: 代表 1024Bytes。所以,要找比 50KB 還要大的文件,就是“ -size +50k ” -type TYPE :搜尋文件的類型為 TYPE 的,類型主要有:一般正規文件 (f), 設備文件 (b, c), 目錄 (d), 鏈接文件 (l), socket (s), 及 FIFO (p) 等屬性。 -perm mode :搜尋文件權限“剛好等于” mode 的文件,這個 mode 為類似 chmod 的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 ! -perm -mode :搜尋文件權限“必須要全部囊括 mode 的權限”的文件,舉例來說, 我們要搜尋 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744, 當一個文件的權限為 -rwsr-xr-x ,亦即 4755 時,也會被列出來, 因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。 -perm /mode :搜尋文件權限“包含任一 mode 的權限”的文件,舉例來說,我們搜尋 -rwxr-xr-x ,亦即 -perm /755 時,但一個文件屬性為 -rw------- 也會被列出來,因為他有 -rw.... 的屬性存在! 范例五:找出文件名為 passwd 這個文件 [root@study ~]# find / -name passwd 范例五-1:找出文件名包含了 passwd 這個關鍵字的文件 [root@study ~]# find / -name "*passwd*" # 利用這個 -name 可以搜尋文件名啊!默認是完整文件名,如果想要找關鍵字, # 可以使用類似 * 的任意字符來處理 范例六:找出 /run 目錄下,文件類型為 Socket 的文件名有哪些? [root@study ~]# find /run -type s # 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的文件, # 例如 socket 與 FIFO 文件,可以用 find /run -type p 或 -type s 來找! 范例七:搜尋文件當中含有 SGID 或 SUID 或 SBIT 的屬性 [root@study ~]# find / -perm /7000 # 所謂的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以當然要使用 /7000, # 使用 -7000 表示要同時含有 ---s--s--t 的所有三個權限。而只需要任意一個,就是 /7000 ~瞭乎? ``` 上述范例中比較有趣的就屬 -perm 這個選項啦!他的重點在找出特殊權限的文件啰! 我們知道 SUID 與 SGID 都可以設置在二進制程序上,假設我想要找出來 /usr/bin, /usr/sbin 這兩個目錄下, 只要具有 SUID 或 SGID 就列出來該文件,你可以這樣做: ``` [root@study ~]# find /usr/bin /usr/sbin -perm /6000 ``` 因為 SUID 是 4 分,SGID 2 分,總共為 6 分,因此可用 /6000 來處理這個權限! 至于 find 后面可以接多個目錄來進行搜尋!另外, find 本來就會搜尋次目錄,這個特色也要特別注意喔! 最后,我們再來看一下 find 還有什么特殊功能吧! ``` 選項與參數: 4\. 額外可進行的動作: -exec command :command 為其他指令,-exec 后面可再接額外的指令來處理搜尋到的結果。 -print :將結果打印到屏幕上,這個動作是默認動作! 范例八:將上個范例找到的文件使用 ls -l 列出來~ [root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; # 注意到,那個 -exec 后面的 ls -l 就是額外的指令,指令不支持命令別名, # 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意! 范例九:找出系統中,大于 1MB 的文件 [root@study ~]# find / -size +1M ``` find 的特殊功能就是能夠進行額外的動作(action)。我們將范例八的例子以圖解來說明如下: ![find 相關的額外動作](https://box.kancloud.cn/2016-05-13_57357373222c4.gif)圖6.5.2、find 相關的額外動作 該范例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵字,這些東西的意義為: * {} 代表的是“由 find 找到的內容”,如上圖所示,find 的結果會被放置到 {} 位置中; * -exec 一直到 \; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (\;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是“ ls -l {} ”啰! * 因為“ ; ”在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。 通過圖 6.5.2 你應該就比較容易了解 -exec 到 \; 之間的意義了吧! 如果你要找的文件是具有特殊屬性的,例如 SUID 、文件擁有者、文件大小等等, 那么利用 locate 是沒有辦法達成你的搜尋的!此時 find 就顯的很重要啦! 另外,find 還可以利用萬用字符來找尋文件名呢!舉例來說,你想要找出 /etc 下面文件名包含 httpd 的文件, 那么你就可以這樣做: ``` [root@study ~]# find /etc -name '*httpd*' ``` 不但可以指定搜尋的目錄(連同次目錄),并且可以利用額外的選項與參數來找到最正確的文件名!真是好好用! 不過由于 find 在尋找數據的時后相當的操硬盤!所以沒事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 [whereis](../Text/index.html#whereis) 與 [locate](../Text/index.html#locate) 啰!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看