簡體   English   中英

如何根據通配符匹配遞歸查找當前文件夾和子文件夾中的所有文件?

[英]How can I recursively find all files in current and subfolders based on wildcard matching?

如何根據通配符匹配遞歸查找當前文件夾和子文件夾中的所有文件?

使用find

find . -name "foo*"

find需要一個起點,所以. (dot) 指向當前目錄。

管道 find 到 grep 通常更方便; 它為您提供了用於任意通配符匹配的正則表達式的全部功能。

例如,要查找文件名中包含不區分大小寫字符串“foo”的所有文件:

~$ find . -print | grep -i foo

find將查找與模式匹配的所有文件:

find . -name "*foo"

但是,如果你想要一張圖片:

tree -P "*foo"

希望這可以幫助!

fd

如果find太慢,請嘗試fd實用程序 - 一個簡單而快速的替代find用 Rust 編寫的。

句法:

fd PATTERN

演示:

主頁: https ://github.com/sharkdp/fd

find -L . -name "foo*"

在少數情況下,我需要 -L 參數來處理符號目錄鏈接。 默認情況下,符號鏈接被忽略。 在這些情況下,這很令人困惑,因為我會將目錄更改為子目錄並查看與模式匹配的文件,但 find 不會返回文件名。 使用 -L 解決了這個問題。 find 的符號鏈接選項是 -P -L -H

如果您的 shell 支持新的 globbing 選項(可以通過: shopt -s globstar啟用),您可以使用:

echo **/*foo*

遞歸查找任何文件或文件夾。 這受到 Bash 4、zsh 和類似 shell 的支持。


我個人已經定義了這個 shell 函數:

f() { find . -name "*$1*"; }

注意:上面的行可以直接粘貼到 shell 或添加到用戶的~/.bashrc文件中。

然后我可以通過鍵入以下內容來查找任何文件:

f some_name

或者,您可以使用具有簡單語法的fd實用程序,例如fd pattern

利用

find path/to/dir -name "*.ext1" -o -name "*.ext2"

解釋

  1. 第一個參數是要搜索的目錄。
  2. 默認情況下find進行遞歸。
  3. -o代表-or 所以上面的意思是搜索這個通配符或這個。 如果您只有一種模式,則不需要-o
  4. 通配符模式周圍的引號是必需的。
find <directory_path>  -type f -name "<wildcard-match>"

在通配符匹配中,您可以提供您希望匹配的字符串,例如 *.c(適用於所有 c 文件)

您可以使用:

# find . -type f  -name 'text_for_search'

如果你想使用 REGX 使用-iname

# find . -type f  -iname 'text_for_search'

用於文件搜索
find / -xdev -name settings.xml --> 整台計算機
find ./ -xdev -name settings.xml --> 當前目錄及其子目錄

對於具有擴展名類型的文件

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

我很驚訝地發現,當我們要遞歸時,locate 並沒有被大量使用。

我會先定位“$PWD”以獲取當前感興趣的文件夾中的文件列表,然后隨意對它們運行 greps。

locate "$PWD" | grep -P <pattern>

當然,這是假設 updatedb 已經完成並且索引會定期更新。 這種查找文件的方法比運行查找並要求它沿樹向下查找要快得多。 為了完整起見,提到這一點。 如果樹不是很重,沒有什么反對使用 find 的。

搜索遞歸文件的默認方式,在大多數情況下可用

find . -name "filepattern"

它從您所在的當前目錄開始遞歸遍歷文件名或模式。 使用 find 命令,您可以使用通配符和各種開關來查看完整的選項列表,輸入

man find

或者如果您的系統上沒有手冊頁

find --help

然而,有更多現代和更快的工具然后找到,它們遍歷你的整個文件系統並索引你的文件,一個這樣的常用工具是定位或定位/mlocate,你應該檢查你的操作系統手冊關於如何安裝它,一旦它安裝它需要啟動數據庫,如果安裝腳本不為你做,可以通過鍵入手動完成

sudo updatedb

並且,使用它來查找某些特定的文件類型

locate filename

或者,要從當前目錄中查找文件名或模式,您可以鍵入:

 pwd | xargs -n 1 -I {} locate "filepattern"

它將查看其文件數據庫並快速打印出與您鍵入的模式匹配的路徑名。 要查看 locate 選項的完整列表,請輸入: locate --helpman locate

此外,您可以配置 locate 以通過 cron 作業在預定時間更新其數據庫,因此在凌晨 1 點更新 db 的示例 cron 如下所示:

0 1 * * * updatedb

這些 cron 作業需要由 root 配置,因為 updatedb 需要 root 權限才能遍歷整個文件系統。

以下命令將列出當前及其子文件夾中具有確切名稱“模式”(例如)的所有文件。

find ./ -name "pattern"

如果要使用通配符搜索特殊文件,可以使用以下代碼:

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

假設,您想從這里搜索每個 .conf 文件:

. 表示從此處開始搜索(當前位置)
-type表示搜索項的類型,這里是文件 (f)。
-name表示您要搜索具有*.conf名稱的文件。

下面的命令有助於搜索任何文件

1) 不分情況
2)結果未經許可排除文件夾
3)從根目錄或您喜歡的路徑搜索。 使用您喜歡的路徑更改 / 。

句法 :
查找 -iname '' 2>&1 | grep -v "權限被拒絕"

例子

查找 / -iname 'C*.xml' 2>&1 | grep -v "權限被拒絕"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

這將搜索當前和子目錄中的所有相關文件,分別計算它們的行數以及完全計算它們的行數:

find . -name "*.wanted" | xargs wc -l

如果已安裝,請嘗試使用fd命令。 安裝說明

查找所有以“名稱”開頭的文件

fd "name*"

此命令忽略所有.hidden.gitignore ed 文件。

要包含.gitignore ed 文件,請添加-I選項,如下所示

fd -I "name*"

要包含隱藏文件,請添加-H選項,如下所示

fd -H "name*"

您也可以使用 ripgrep。 手冊頁: https://www.mankier.com/1/rg#--files
例子:
搜索所有包含 substring psql的文件名

rg --files | rg psql

使用 Python>3.5,使用glob. 指向您當前的文件夾並查找.txt文件:

 python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"

對於舊版本的 Python,您可以安裝glob2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM