Localiza arquivos com tamanho mínimo de nome de arquivo

4

Gostaria de encontrar todos os arquivos em uma determinada pasta que tenham um nome de arquivo de pelo menos n caracteres (extensão incluída). Existe alguma maneira de conseguir isso com find ?

    
por gieldops 19.10.2013 / 19:44

4 respostas

4

Você pode usar o comando find com -regex test

$ find /path/to/folder -regextype posix-basic -regex '.*/.\{5,\}'

ou

$ find /path/to/folder -regextype posix-extended -regex '.*/.{5,}'

Observe que -regex é uma correspondência de caminho em vez de uma correspondência de arquivo - portanto, você precisa igualar também o líder .*/ , antes do caractere 5+ nome do arquivo


Alternativamente, para uma solução bash pura, você poderia habilitar globbing de shell estendido e então usar o padrão !(@(?|??|???|????)) significando 'qualquer coisa que não corresponda a um ou dois ou três ou quatro caracteres'

$ shopt -s extglob
$ ls -d /path/to/folder/!(@(?|??|???|????))

Se você deseja incluir subdiretórios, também é possível ativar a opção globstar e adicionar um curinga ** , por exemplo

$ shopt -s extglob globstar
$ ls -d /path/to/folder/**/!(@(?|??|???|????))

por exemplo

$ ls -d **/!(@(?|??|???|????))
abcde  abcdef  abcdefg  subdir  subdir/abcde  subdir/abcdef  subdir/abcdefg

enquanto as correspondências não invertidas (arquivos menores que 5 caracteres) são

$ ls -d **/@(?|??|???|????)
a  ab  abc  abcd  subdir/a  subdir/ab  subdir/abc  subdir/abcd

Para remover as opções depois, use

$ shopt -u extglob globstar
    
por steeldriver 19.10.2013 / 20:02
7

Acho que a maneira mais simples é usar:

find . -name "??????????*"

em que o número de ? caracteres é igual a n . É simples porque é difícil esquecer isso.

Mas a melhor maneira é usar a opção -regex para encontrar nomes de arquivos com n ou mais caracteres:

find . -regextype posix-egrep -regex ".*[^/]{n}"

onde n deve ser um número natural (o tamanho mínimo do nome do arquivo).

Veja man find mais sobre.

    
por Radu Rădeanu 19.10.2013 / 20:00
0

Você pode percorrer a lista de arquivos retornados por find e testar o tamanho do nome de base de cada arquivo:

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

Esta função usa somente mecanismos internos de find e Bash e nenhuma correspondência de expressão regular. Coloque essa definição de função no arquivo ~/.bashrc para tornar o comando min_fname persistente entre os logins.

    
por user54813 19.10.2013 / 20:09
0

Abordagem 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()

O uso é simples:

./find_files_len.py /path/to/top_directory/  minimal_length

Por exemplo:

./find_files_len.py /etc  5 

Isso nos dará todos os arquivos com nome de base de pelo menos 5 caracteres, encontrados recursivamente por /etc/ e todos os seus subdiretórios. Note que o caminho completo do arquivo será impresso na linha de comando

    
por Sergiy Kolodyazhnyy 03.01.2017 / 11:59

Tags