我想按文件名長度找到所有文件。
例如如果我想查找長度為1的文件,例如a.go
,b.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