如何從命令行在文件系統中查找文件?
我想找到一個文件(文件名部分已知)在文件系統中的位置。我想知道如何從命令行執行此操作,而不是使用 GUI 實用程序。
在 Windows 中,我將執行以下命令:
cd /d C:\ dir *filename* /s
Linux 等價物是什麼?
locate filename find -name '*filename*' echo **/*filename* ls -ld **/*filename*
(繼續閱讀主要條款和條件。閱讀手冊以了解細則。)
列出目錄的內容是
ls
. 的主要工作ls
,佔其大部分複雜性的工作,是微調其顯示。(查看手冊並比較與選擇要顯示的文件相關的選項數量與控制要顯示的有關每個文件的哪些資訊以及顯示格式的選項數量。這對你的GNU ls來說都是如此。從早期開始,可以在 Linux 和其他選項較少的系統上找到。)的預設模式
ls
是,當您將目錄傳遞給它時,它會列出該目錄中的文件。如果您將任何其他類型的文件(正常文件、符號連結等)傳遞給它,它只會列出該文件。(這分別適用於每個參數。)該選項-d
告訴ls
永遠不要進入目錄。
ls
確實有一個選項-R
告訴它遞歸地列出目錄。但它的適用性有限,並且不允許對輸出進行太多過濾。執行模式匹配的第一個工具是 shell 本身。您不需要任何其他命令:只需輸入萬用字元即可。這稱為globbing。
echo *filename*
傳統上,萬用字元僅限於目前目錄(或指定目錄:
echo /some/where/*filename*
)。A*
匹配任何文件名或文件名的任何部分,但*.txt
不會匹配foo/bar.txt
. 現代 shell 添加了模式**/
,意思是“在這個目錄中,或者在它下面的任何目錄中(遞歸地)”。對於 bash,出於歷史兼容性原因,需要顯式啟用此功能shopt -s globstar
(您可以將此行放在您的~/.bashrc
.echo **/*filename*
該
echo
命令只是將 shell 生成的文件名列表回顯給您。作為一個例外,如果根本沒有匹配的文件名,萬用字元模式在 bash 中保持不變(除非您設置shopt -s nullglob
,在這種情況下,模式擴展為一個空列表),並且 zsh 發出錯誤信號(除非您設置setopt nullglob
,或setopt no_no_match
這導致模式保持不變)。您可能仍想使用
ls
它的選項。例如,ls
可以通過顏色指示文件(目錄、執行檔等)的性質或權限。您可能想用 . 顯示文件的日期、大小和所有權ls -l
。有關更多選項,請參閱手冊。在目錄樹中查找文件的傳統命令是
find
. 它帶有許多選項來控制要顯示哪些文件以及如何處理它們。例如,要查找名稱與*filename*
目前目錄及其子目錄中的模式匹配的文件並列印它們的名稱:find /some/dir -name '*filename*' -print
/some/dir
如上),則暗示目前目錄。該條件-name '*filename'
表示僅列出(或作用於)名稱與該模式匹配的文件;還有許多其他過濾器,例如-mtime -1
匹配過去 24 小時內修改的文件。您有時可以省略 上的引號-name '*filename*'
,但前提是萬用字元與目前目錄中的任何文件都不匹配(見上文)。總而言之,簡短的形式是find -name '*filename*'
當您知道(部分)文件名時,另一個有用的工具是
locate
. 此工具查詢文件名數據庫。在典型的系統上,它每晚都會刷新。locate
over的好處find /
是速度快很多。缺點是它的資訊可能是陳舊的。有幾種不同的實現locate
在多使用者系統上的行為有所不同:基本locate
程序僅索引公開可讀的文件(您可能希望執行配套updatedb
程序來創建第二個數據庫來索引您帳戶中的所有文件);還有其他版本(mlocate,slocate)索引所有文件並讓locate
程序過濾數據庫以僅返回您可以看到的文件。locate filename
有時你認為一個文件是由你的發行版中的一個包提供的,你知道(部分)文件名但不知道你的包名,並且你想安裝這個包。許多發行版為此提供了工具。在 Ubuntu 上,它是
apt-file search filename
. 對於其他系統上的等效命令,請查看Pacman Rosetta。