Command-Line

按文件名長度查找文件

  • November 4, 2020

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

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

我放:

grep '.\{1\}' file

但這不起作用。我可以使用什麼命令按文件名長度查找文件?

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

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

這將執行find,使用提取文件或目錄的名稱basename,然後查找至少 100 個字元的任何文件名或目錄名稱。如果您想找到一個確切長度的文件名,請使用{100}而不是{100,}.

如果要查找包含路徑的文件名,請執行以下操作:

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

這將返回文件名,包括執行 find 命令的相對路徑。

首先,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}\.[^.]+$'

注意:上面的解決方案假設您有相對健全的文件名,不包含換行符等。在計算可能不是您想要的長度時,它也會計算不忽略文件名中的空格。如果其中任何一個有問題,請告訴我,我會更新我的答案。

引用自:https://unix.stackexchange.com/questions/93111