自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于 find 命令的15個(gè)超級(jí)有用的例子

系統(tǒng) Linux
本文我們會(huì)分享關(guān)于 find 命令的一些常見示例。不過在此之前,我們先來看一下它的語法,以及如何使用。

find 命令用于在 Linux 命令行中搜索文件和目錄。

find 是功能最強(qiáng)大、使用最頻繁的命令之一,同時(shí)也是選項(xiàng)最多的命令之一,它有50多個(gè)選項(xiàng),很容易讓人弄混了,特別是當(dāng)它與 exec 或 xargs 命令一起使用的時(shí)候。

作為系統(tǒng)管理員或者軟件開發(fā)者,在命令行中工作時(shí)都不可避免的會(huì)使用到 find 命令。所以,與其畏難而逃避它,不如知難而進(jìn),擁抱它的力量。

本文我們會(huì)分享關(guān)于 find 命令的一些常見示例。不過在此之前,我們先來看一下它的語法,以及如何使用。

Linux 中的 find 命令

find 命令的一般語法為:

find [directory to search] [options] [expression]

方括號(hào) [] 中所有的內(nèi)容都是可選的,這意味著你可以在沒有任何選項(xiàng)和參數(shù)的情況下運(yùn)行 find 命令。不過這只會(huì)打印出當(dāng)前路徑下所有的文件和目錄,這樣沒什么用處,對吧?

我們來詳細(xì)了解一下它的參數(shù)。

  • directory to search:要搜索的目錄,基本上就是我們要開始搜索的位置。默認(rèn)情況下,搜索是遞歸的(也會(huì)搜索子目錄),從當(dāng)前位置開始;
  • options:選項(xiàng),指定搜索的類型,可以按文件名稱、文件類型、修改時(shí)間等(進(jìn)行搜索),這里有50多個(gè)選項(xiàng);
  • expression:指定的搜索詞。如果是要按文件名查找,那么搜索詞就是文件名;如果是要查找名稱與表達(dá)式匹配的文件,那這里就用表達(dá)式。

看下面的例子:

find . -type f -name myfile

該命令將在當(dāng)前目錄及其子目錄中進(jìn)行搜索,查找名為 myfile 的文件(不是目錄)。選項(xiàng) -type f 表示只查找文件,單點(diǎn) . 表示當(dāng)前目錄。

按名稱查找文件和目錄

可以按文件名搜索文件和目錄:

find . -name SEARCH_NAME

由于沒有指定文件類型,所以它會(huì)搜索具有給定名稱的文件和目錄。

下面的例子找到名為 mystuff 的文件和目錄:

[gliu@fedora work]$ find -name mystuff./new/mystuff./mystuff

只查找文件或目錄

如果只想查找文件,那么需要指定文件類型 -f

find . -type f -name SEARCH_NAME

類型和名稱的順序無關(guān)緊要。上一個(gè)例子中,只查找文件,可使用如下命令:

[gliu@fedora work]$ find -type f -name mystuff./mystuff

如果只搜索目錄,那么指定類型 -d

find . -type d -name SEARCH_NAME

還是上面那個(gè)例子,如果只查找目錄,使用如下命令:

[gliu@fedora work]$ find -type d -name mystuff./new/mystuff

執(zhí)行不區(qū)分大小寫的搜索

默認(rèn)情況下,find 命令區(qū)分大小寫。如果我們想要執(zhí)行不區(qū)分大小寫的搜索,可以使用 -iname 來代替 -name

find . -type f -iname SEARCH_NAME

也可以將其與 -d 選項(xiàng)一起使用。

[gliu@fedora work]$ find -iname mystuff./new/mystuff./MyStuff./mystuff

按擴(kuò)展名搜索(重要)

find 命令最常見的用法之一就是查找指定類型的文件,或者說是按照文件擴(kuò)展名來進(jìn)行查找。

比如,我們要在當(dāng)前目錄下搜索所有的 C++ 文件,而C++文件的擴(kuò)展名是 .cpp,所以我們可以這樣搜索:

find . -type f -name "*.cpp"

這樣,我們告訴 find 命令查找類型為文件(file),并且以 .cpp 結(jié)尾的文件。

[gliu@fedora work]$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zf

注意:在使用 find 命令時(shí),需要將表達(dá)式放在雙引號(hào)中。

為什么要將表達(dá)式放在雙引號(hào)中呢?因?yàn)槿绻贿@樣做的話,shell會(huì)擴(kuò)展通配符,將其替換為當(dāng)前目錄中所有以 .cpp 結(jié)尾的文件。

比如,假如當(dāng)前目錄下有兩個(gè)文件:file1.cpp, file2.cpp,那么下面的命令:

find . -type f -name *.cpp

會(huì)被shell擴(kuò)展為:

find . -type f -name file1.cpp file2.cpp

這種情況下,shell 就會(huì)給出提示:

find: paths must precede expression: 'file1.cpp'find: possible unquoted pattern after predicate '-name'?

另外,如果當(dāng)前目錄下只有一個(gè)擴(kuò)展名為.cpp的文件,那就可以。

搜索多個(gè)擴(kuò)展名(或條件)的多個(gè)文件

上述命令搜索給定擴(kuò)展名的文件。那如果要同時(shí)搜索不同擴(kuò)展名的文件,該怎么辦呢?

可以使用邏輯或(OR) -o 來運(yùn)行 find 命令:

find . -type f -name "*.cpp" -o -name "*.txt"

這樣,就會(huì)搜索擴(kuò)展名為 .cpp 或 .txt 的文件:

[gliu@fedora work]$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt

在指定目錄中查找文件

我們上面的例子都是在當(dāng)前目錄中搜索,因?yàn)槲覀冊诿钪兄付?. 作為當(dāng)前路徑。

點(diǎn) . 可以替換為絕對路徑或者相對路徑。這樣我們就可以在不離開當(dāng)前路徑的情況下,在指定的目錄中查找文件。

[gliu@fedora work]$ find ./new -name mystuff ./new/mystuff

在多個(gè)目錄中搜索文件

如果你認(rèn)為所要查找的文件可能位于多個(gè)位置,那么不必多次運(yùn)行 find 命令,只需在 find 命令中指定要搜索的所有目錄路徑即可:

find ./location1 /second/location -type f -name "pattern"

查找空文件和目錄

-empty 選項(xiàng)可以讓你使用 find 命令查找空文件和目錄。比如要查找當(dāng)前路徑下所有的空文件和目錄,可使用如下命令:

find . -empty

也可以指定搜索的文件類型,只查找文件或者目錄:

find . -empty -type f

還可以結(jié)合文件名使用:

find . -empty -type f -name "*.cpp"

查找大文件或小文件(根據(jù)文件大小搜索)

根據(jù)文件的大小執(zhí)行搜索,可以查找大文件或者小文件。但這只適用于文件,不適用于目錄。

要根據(jù)文件的大小搜索,可以使用 -size 選項(xiàng),后面跟上一個(gè)值N(即文件的大?。?strong>+N 查找大于 N 的文件,-N 查找小于 N 的文件。

比如,查找大小正好為 50KB 的文件:

find . -size 50k

在當(dāng)前路徑下查找大于 1G 的文件:

find . -size +1G

查找小于 20 bytes 的文件(注意單位是c而不是b):

find . -size -20c

要查找大于100 MB 但小于 2 GB 的文件:

find . -size +100M -size -2G

此外,還可以結(jié)合名稱搜索。比如,要在根目錄中查找以 .log 結(jié)尾,大于500MB的文件,可使用如下命令:

find / -size +500M -name "*.log"

關(guān)于文件大小值 N 的單位:

  • c : bytes(字節(jié))
  • k: kilobytes(千字節(jié))
  • M: Megabytes(兆字節(jié))
  • G: Gigabytes(GB)

查找最近修改的文件(根據(jù)修改或創(chuàng)建時(shí)間搜索)

我們先來簡單介紹下mtime, atime ctime 的概念:

  • mtime:文件上次修改的時(shí)間;
  • ctime:文件創(chuàng)建的時(shí)間;
  • atime:文件上次訪問的時(shí)間。

我們經(jīng)常會(huì)有查找最近修改過的文件的需求,這時(shí)候,可以按修改時(shí)間來搜索文件。

比如,要查找 3天(3 * 24H)以內(nèi)修改過的所有文件:

find . -type f -mtime -3

再比如,查找 5天以前創(chuàng)建的文件:

find . -type f -ctime +5

上述命令是以天為單位。那么,如果要搜索幾分鐘前修改過的文件呢?可以使用 mmin, amin cmin。

比如,要查找 5分鐘以內(nèi)修改過的文件,可使用如下命令:

find . -type f -mmin -5

此外,還可以結(jié)合名稱,指定時(shí)間的上限和下限進(jìn)行搜索。比如,下面的命令將搜索過去20分鐘到30分鐘內(nèi),修改過的所有 .java 文件:

find . -type f -mmin +20 -mmin -30 -name "*.java"

查找具有特定文件權(quán)限的文件

find命令允許您搜索具有特定權(quán)限的文件。

find -perm mode

比如,在當(dāng)前路徑下查找所有權(quán)限模式為 777 的文件:

find . -perm 777

查找具有讀寫權(quán)限的文件(完全匹配,如果文件權(quán)限為 讀寫和執(zhí)行,則不匹配):

find . -perm a=r+w

根據(jù)文件的所屬用戶查找

find 還可以根據(jù)文件的所有權(quán)進(jìn)行搜索。

比如,在當(dāng)前路徑下搜索用戶 John 所擁有的文件:

find . -type f -user John

當(dāng)然,也可以與其他選項(xiàng)(比如文件大小,時(shí)間,名稱等)結(jié)合使用:

find . -type f -user John -name "*.cpp"

不遞歸查找,僅在當(dāng)前目錄中搜索

默認(rèn)情況下,find 命令在當(dāng)前位置的所有子目錄中搜索。如果不希望這樣,可以將搜索深度指定為 1。這將限制搜索僅限于當(dāng)前目錄,不包括任何子目錄。

find . -maxdepth 1 -type f -name "*.txt"

圖片



從搜索中排除目錄

如果要將某個(gè)目錄從搜索中排除,可以結(jié)合 -path, -prune-o 一起使用:

find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME

注意路徑中的星號(hào) *, -prune 選項(xiàng)在路徑之后,-o 選項(xiàng)在 prune 之后。

基本上,prune命令要求不使用路徑指定的值,它總是與 -o 一起使用,以確保 -o 的右側(cè)只針對未被排除的目錄。

處理 find 命令的輸出結(jié)果(使用 exec 和 xargs)

到目前為止,我們介紹了關(guān)于find命令的一些標(biāo)準(zhǔn)查找文件的方法。此外,還可以通過對 find 命令的結(jié)果執(zhí)行某些操作,來改進(jìn)它。

例如,查找與特定名稱模式匹配的文件并一次性重命名,或者查找空文件并刪除。

我們知道,管道重定向可以用于將一個(gè)命令的輸出與另一個(gè)命令輸入相結(jié)合。但這對find命令的輸出不起作用,至少不直接起作用。

如果要對find命令的結(jié)果執(zhí)行操作,有兩個(gè)選項(xiàng),即 exec xargs。

使用 find 和 exec

假如我們要對 find 的結(jié)果使用 ls -l 列出來,看下面的例子:

find . -type f -name "*.txt" -exec ls -l {} +

以下是輸出:?

[gliu@fedora work]$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 gliu gliu 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 gliu gliu 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 18:16 ./new.txt

不要忘記 exec 命令最后的 {} +,并且要注意 {} + 之間的空格。

花括號(hào) {} 引用 find 命令的結(jié)果,你可以將其認(rèn)為是 {file1, file2, file3}。加號(hào) + 用于終止 exec 命令。

exec 還有另一個(gè)約定:

find . -type f -name *.txt" -exec ls -l

上述命令中,分號(hào) ; 用于代替加號(hào) +,分號(hào)前面的反斜杠 \ 用于轉(zhuǎn)義特殊字符。

{} + 的優(yōu)點(diǎn)是它運(yùn)行的命令更少,它就相當(dāng)于是 ls -l file1 file2 file3;而 {} \ 則相當(dāng)于運(yùn)行 ls -l file1, ls -l file2, ls -l file3。

但是,{} \;具有在同一 exec 語句中多次使用 {} 的優(yōu)點(diǎn)。例如,下面的命令將使用 .old 擴(kuò)展名重命名所有找到的文件:

find . -type f -name *.txt" -exec mv {} {}.old

使用 xargs

許多 Linux 用戶已經(jīng)習(xí)慣了管道重定向。這個(gè)帶有尾隨 { }+ 的 exec 命令對他們來說似乎不太習(xí)慣。

這就是 xargs 命令存在的價(jià)值,你只需要通過管道將 find 命令的輸出解析到 xargs 命令:

find . -type f -name *.txt" | xargs ls -l

圖片


find 結(jié)合 grep 使用

上面我們介紹了 find 結(jié)合 exec xargs 命令的使用,此外,還可以將 find 與 grep 命令一塊使用。

對于任何系統(tǒng)管理員或軟件開發(fā)人員來說,find 和 grep 是最常見且最有用的組合之一。

你可以使用 find 命令來查找文件,然后使用 grep 命令來搜索這些文件的內(nèi)容。

比如,我們要搜索所有包含 “Alice”一詞的 txt 文件,那么可以這樣搜索:

find . -type f -name "*.txt" -exec

同樣的,也可以使用 xargs 命令:

find . -type f -name "*.txt"

圖片


當(dāng)然,這是最簡單的例子,如果你熟悉 grep 命令,可以根據(jù)自己的需求和喜好使用它。

find 命令的用法還有很多,我們列舉了一些相對比較常用的。當(dāng)你開始熟悉 find 命令的時(shí)候,就可以在各種情況下使用。

責(zé)任編輯:龐桂玉 來源: TIAP
相關(guān)推薦

2013-10-08 15:51:03

Linux find命

2013-10-08 16:24:34

Linux find命

2020-05-20 13:45:52

Linuxtouch命令

2022-12-22 14:44:06

JavaScript技巧

2022-12-25 16:03:31

JavaScript技巧

2023-07-18 07:56:31

工具reduce業(yè)務(wù)

2023-06-28 00:02:40

2020-04-16 14:20:16

Linuxtouch命令

2023-01-09 10:29:41

mv命令Linux

2018-08-03 11:07:52

dd命令備份Linux系統(tǒng)

2022-12-19 15:23:51

JavaScrip開發(fā)語言

2023-05-30 15:11:16

JavaScrip開發(fā)功能

2023-03-24 10:07:46

tail命令

2023-03-23 21:08:59

head命令

2015-09-28 11:22:55

命令行補(bǔ)全Linux

2012-01-17 13:54:02

PHP

2011-04-15 15:16:18

代碼編程

2020-06-17 05:44:44

人工智能AI機(jī)器學(xué)習(xí)

2023-02-22 16:43:05

Web開發(fā)github

2020-12-14 11:43:27

人工智能智能軟件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)