web-dev-qa-db-fra.com

Trouver des fichiers avec une longueur de fichier minimale

Je voudrais trouver tous les fichiers dans un certain dossier qui ont un nom de fichier d'au moins n caractères (extension incluse). Est-il possible d'y parvenir avec find?

4
gieldops

Vous pouvez utiliser la commande find avec un test -regex

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

ou

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

Notez que -regex est un correspondance du chemin plutôt que correspondance du fichier - vous devez donc également faire correspondre le .*/ initial, avant le 5+. nom de fichier


Alternativement, pour une solution pure bash, vous pouvez activer Extended Shell Globbing puis utiliser le modèle !(@(?|??|???|????)) signifiant 'tout ce qui ne correspond pas à un, deux, trois ou quatre personnages'

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

Si vous souhaitez inclure des sous-répertoires, vous pouvez également activer l'option globstar et ajouter un caractère générique **, par exemple i.e.

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

par exemple

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

tandis que les correspondances non inversées (fichiers de moins de 5 caractères) sont

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

Pour annuler les options par la suite, utilisez

$ shopt -u extglob globstar
4
steeldriver

Je pense que le moyen le plus simple est d'utiliser:

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

où le nombre de ? caractères est égal à n. C'est simple parce qu'il est difficile de l'oublier.

Mais le plus agréable est d’utiliser l’option -regex pour trouver les noms de fichiers avec n ou plusieurs caractères:

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

n devrait être un nombre naturel (la longueur minimale du nom de fichier).

Voir man find avant pour en savoir plus.

7
Radu Rădeanu

Vous pouvez parcourir la liste des fichiers renvoyés par find et tester la longueur du nom de base de chaque fichier:

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

Cette fonction utilise uniquement les mécanismes intégrés find et Bash, et aucune correspondance d'expression régulière. Placez cette définition de fonction dans le fichier ~/.bashrc pour rendre la commande min_fname persistante entre les connexions.

0
user54813

Approche 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 __== '__main__' : main()

L'utilisation est simple:

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

Par exemple:

./find_files_len.py /etc  5 

Cela nous donnera tous les fichiers avec un nom de base d'au moins 5 caractères, trouvés récursivement dans /etc/ et tous ses sous-répertoires. Notez que le chemin complet du fichier sera imprimé sur la ligne de commande

0