查找文件名长度最小的文件

查找文件名长度最小的文件

我想查找某个文件夹中所有文件名至少为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

此函数仅使用findBash 内置机制,不使用正则表达式匹配。将此函数定义放入文件中,~/.bashrc以使min_fname命令在登录之间持久。

相关内容