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
?
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
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}"
où n
devrait être un nombre naturel (la longueur minimale du nom de fichier).
Voir man find
avant pour en savoir plus.
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.
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