命令列快速技巧:如何定位一個檔案

2018-11-20 22:57:00

我們都會有檔案儲存在電腦裡 —— 目錄、相片、原始碼等等。它們是如此之多。也無疑超出了我的記憶範圍。要是毫無目標,找到正確的那一個可能會很費時間。在這篇文章裡我們來看一下如何在命令列裡找到需要的檔案,特別是快速找到你想要的那一個。

好訊息是 Linux 命令列專門設計了很多非常有用的命令列工具在你的電腦上查詢檔案。下面我們看一下它們其中三個:lstreefind

ls

如果你知道檔案在哪裡,你只需要列出它們或者檢視有關它們的資訊,ls 就是為此而生的。

只需執行 ls 就可以列出當下目錄中所有可見的檔案和目錄:

$ lsDocuments Music Pictures Videos notes.txt

新增 -l 選項可以檢視檔案的相關資訊。同時再加上 -h 選項,就可以用一種人們易讀的格式檢視檔案的大小:

$ ls -lhtotal 60Kdrwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Documentsdrwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Musicdrwxr-xr-x 2 adam adam 4.0K Nov 2 13:13 Picturesdrwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Videos-rw-r--r-- 1 adam adam 43K Nov 2 13:12 notes.txt

ls 也可以搜尋一個指定位置:

$ ls Pictures/trees.png wallpaper.png

或者一個指定檔案 —— 即便只跟著名字的一部分:

$ ls *.txtnotes.txt

少了點什麼?想要檢視一個隱藏檔案?沒問題,使用 -a 選項:

$ ls -a. .bash_logout .bashrc Documents Pictures notes.txt.. .bash_profile .vimrc Music Videos

ls 還有很多其他有用的選項,你可以把它們組合在一起獲得你想要的效果。可以使用以下命令了解更多:

$ man ls

tree

如果你想檢視你的檔案的樹狀結構,tree 是一個不錯的選擇。可能你的系統上沒有預設安裝它,你可以使用包管理 DNF 手動安裝:

$ sudo dnf install tree

如果不帶任何選項或者引數地執行 tree,將會以當前目錄開始,顯示出包含其下所有目錄和檔案的一個樹狀圖。提醒一下,這個輸出可能會非常大,因為它包含了這個目錄下的所有目錄和檔案:

$ tree.|-- Documents| |-- notes.txt| |-- secret| | `-- christmas-presents.txt| `-- work| |-- project-abc| | |-- README.md| | |-- do-things.sh| | `-- project-notes.txt| `-- status-reports.txt|-- Music|-- Pictures| |-- trees.png| `-- wallpaper.png|-- Videos`-- notes.txt

如果列出的太多了,使用 -L 選項,並在其後加上你想檢視的層級數,可以限制列出檔案的層級:

$ tree -L 2.|-- Documents| |-- notes.txt| |-- secret| `-- work|-- Music|-- Pictures| |-- trees.png| `-- wallpaper.png|-- Videos`-- notes.txt

你也可以顯示一個指定目錄的樹狀圖:

$ tree Documents/work/Documents/work/|-- project-abc| |-- README.md| |-- do-things.sh| `-- project-notes.txt`-- status-reports.txt

如果使用 tree 列出的是一個很大的樹狀圖,你可以把它跟 less 組合使用:

$ tree | less

再一次,tree 有很多其他的選項可以使用,你可以把他們組合在一起發揮更強大的作用。man 手冊頁有所有這些選項:

$ man tree

find

那麼如果不知道檔案在哪裡呢?就讓我們來找到它們吧!

要是你的系統中沒有 find,你可以使用 DNF 安裝它:

$ sudo dnf install findutils

執行 find 時如果沒有新增任何選項或者引數,它將會遞迴列出當前目錄下的所有檔案和目錄。

$ find../Documents./Documents/secret./Documents/secret/christmas-presents.txt./Documents/notes.txt./Documents/work./Documents/work/status-reports.txt./Documents/work/project-abc./Documents/work/project-abc/README.md./Documents/work/project-abc/do-things.sh./Documents/work/project-abc/project-notes.txt./.bash_logout./.bashrc./Videos./.bash_profile./.vimrc./Pictures./Pictures/trees.png./Pictures/wallpaper.png./notes.txt./Music

但是 find 真正強大的是你可以使用檔名進行搜尋:

$ find -name do-things.sh./Documents/work/project-abc/do-things.sh

或者僅僅是名字的一部分 —— 像是檔案字尾。我們來找一下所有的 .txt 檔案:

$ find -name "*.txt"./Documents/secret/christmas-presents.txt./Documents/notes.txt./Documents/work/status-reports.txt./Documents/work/project-abc/project-notes.txt./notes.txt

你也可以根據大小尋找檔案。如果你的空間不足的時候,這種方法也許特別有用。現在來列出所有大於 1 MB 的檔案:

$ find -size +1M./Pictures/trees.png./Pictures/wallpaper.png

當然也可以搜尋一個具體的目錄。假如我想在我的 Documents 資料夾下找一個檔案,而且我知道它的名字裡有 “project” 這個詞:

$ find Documents -name "*project*"Documents/work/project-abcDocuments/work/project-abc/project-notes.txt

除了檔案它還顯示目錄。你可以限制僅搜尋查詢檔案:

$ find Documents -name "*project*" -type fDocuments/work/project-abc/project-notes.txt

最後再一次,find 還有很多供你使用的選項,要是你想使用它們,man 手冊頁絕對可以幫到你:

$ man find