我想查找某个文件夹中所有文件名至少为n
个字符(包括扩展名)的文件。有什么方法可以实现此目的吗find
?
答案1
我认为最简单的方法是使用:
find . -name "??????????*"
其中字符数?
与 相等n
。很简单,因为很难忘记它。
但最好的方法是使用-regex
选项来查找包含n
或更多字符的文件名:
find . -regextype posix-egrep -regex ".*[^/]{n}"
其中n
应该是一个自然数(最小文件名长度)。
请参阅man find
有关更多信息。
答案2
您可以使用find
命令进行-regex
测试
$ find /path/to/folder -regextype posix-basic -regex '.*/.\{5,\}'
或者
$ find /path/to/folder -regextype posix-extended -regex '.*/.{5,}'
-regex
请注意路径匹配而不是文件匹配.*/
- 因此您还需要匹配前导字符,即 5 个以上字符的文件名之前的字符
或者,对于纯 bash 解决方案,您可以启用扩展 shell 通配符然后使用!(@(?|??|???|????))
表示“不匹配一个、两个、三个或四个字符的任何内容”的模式
$ shopt -s extglob
$ ls -d /path/to/folder/!(@(?|??|???|????))
如果要包含子目录,globstar
也可以启用该选项并添加**
通配符,即
$ shopt -s extglob globstar
$ ls -d /path/to/folder/**/!(@(?|??|???|????))
例如
$ ls -d **/!(@(?|??|???|????))
abcde abcdef abcdefg subdir subdir/abcde subdir/abcdef subdir/abcdefg
而非反向匹配(少于 5 个字符的文件)是
$ ls -d **/@(?|??|???|????)
a ab abc abcd subdir/a subdir/ab subdir/abc subdir/abcd
之后要取消设置选项,请使用
$ shopt -u extglob globstar
答案3
Python 方法:
#!/usr/bin/env python
from __future__ import print_function
import os,sys
def main():
treeroot = sys.argv[1]
base_len = int(sys.argv[2])
for dir,subdirs,files in os.walk(treeroot):
for f in files:
if len(f) >= base_len:
fullpath = os.path.abspath(os.path.join(dir,f))
print(fullpath)
if __name__ == '__main__' : main()
使用方法很简单:
./find_files_len.py /path/to/top_directory/ minimal_length
例如:
./find_files_len.py /etc 5
这将返回所有文件,这些文件的基本名称至少为 5 个字符,并通过递归方式找到它们/etc/
及其所有子目录。请注意,文件的完整路径将打印到命令行
答案4
您可以循环返回的文件列表find
并测试每个文件的基本名称的长度:
min_fname() {
for path in $(find "$1" -type f); do
bn="${path##*/}"
if (( "${#bn}" >= $2 )); then
echo "$path"
fi
done
}
# usage: min_fname dir value
$ min_fname /tmp 5
$ min_fname /home/user 10
此函数仅使用find
Bash 内置机制,不使用正则表达式匹配。将此函数定义放入文件中,~/.bashrc
以使min_fname
命令在登录之间持久。