按檔案名稱長度尋找文件

按檔案名稱長度尋找文件

我想按文件名長度找到所有文件。

例如如果我想查找長度為1的文件,例如a.gob.go.

我放:

grep '.\{1\}' file

但這是行不通的。我可以使用什麼命令來按文件名長度查找文件?

答案1

如果您只想查找檔案名,可以使用以下命令:

find -exec basename '{}' ';' | egrep '^.{100,}$'

這將運行find,使用提取檔案或目錄的名稱basename,然後尋找至少包含 100 個字元的任何檔案名稱或目錄名稱。如果您想尋找精確長度的檔案名,請{100}使用{100,}.

如果您想尋找包含路徑的檔案名,請執行下列操作:

find | egrep '/[^/]{100,}$'

這將傳回檔名,包括運行 find 命令的相對路徑。

答案2

grep尋找文件內容中的模式。如果您想查看名字對於這些文件,您可以只使用 shell glob(如果您只想考慮目前目錄中的文件名稱):

echo ?.go

(順便說一下,是 shell 計算 glob,而不是指令echo。)

如果您想從目前目錄開始遞歸地尋找目錄,則要使用的工具是find

find . -name '?.go'

(請注意,您必須引用該模式,以防止 shell 在呼叫之前將其作為 glob 進行評估find。)

答案3

首先,grep透過搜尋內容文件,它不會搜尋文件名稱。為了你想要的find。它沒有設定檔案名稱長度的選項,但您可以解析它的輸出以獲得您想要的內容。以下是我在包含以下文件的目錄中運行的一些範例:

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

在此目錄中搜尋檔案將會傳回:

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

因此,要查找長度為 X 的文件,我們需要刪除路徑並僅匹配最後一個之後的字元/

 $ find . -type f | grep -P '/.{3}$'

sed指令只是刪除./.此-P標誌啟動 Perl 相容正規表示式,這是{n}PCRE 所需要的,其$意義是「符合字串的結尾」。

你也可以簡單地這樣做:

find . -type f | grep -P '/...$'

對於小數字來說這很好,輸入 15 個點來匹配長度為 15 的檔案名,但效率不高。

最後,如果您想忽略擴展名並僅匹配文件名,請執行以下操作(如 @slm 建議):

find . -type f | grep -P '/.{1}\.'

但是,這也會找到類似a.bo.go.如果您的檔案名稱可以包含多個.

find . -type f | grep -P '/.{1}\.[^.]+$'

注意:上面的解決方案假設您有相對健全的檔案名,不包含換行符號等。如果其中任何一個有問題,請告訴我,我會更新我的答案。

答案4

您不指定,但如果檔案位於目錄結構內,您可以使用以下命令find來尋找長度為 1 的檔案grep

$ find . -type f  | grep -P '/.{1}\.'

例子

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

相關內容