Tout d'abord, grep
recherche dans le contenu des fichiers, il ne recherchera pas les noms de fichiers. Pour ça tu veux find
. Il n'a pas d'option pour définir la longueur du nom de fichier mais vous pouvez analyser sa sortie pour obtenir ce que vous voulez. Voici quelques exemples que j'exécute dans un répertoire contenant les fichiers suivants:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
La recherche de fichiers dans ce répertoire renvoie:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
Donc, pour trouver les fichiers d'une longueur de X, nous devrons supprimer le chemin et ne faire correspondre que les caractères après le dernier /
:
$ find . -type f | grep -P '/.{3}$'
La sed
commande supprime simplement le ./
. Le -P
drapeau active les expressions régulières compatibles Perl qui sont nécessaires, {n}
ce qui est une chose PCRE et les $
moyens "correspondent à la fin de la chaîne".
Vous pouvez également simplement faire ceci:
find . -type f | grep -P '/...$'
C'est bien pour les petits nombres taper 15 points pour correspondre aux noms de fichiers de longueur 15 n'est pas très efficace.
Enfin, si vous souhaitez ignorer l'extension et ne faire correspondre que le nom du fichier, faites-le (comme l'a suggéré @slm):
find . -type f | grep -P '/.{1}\.'
Cependant, cela trouvera également des fichiers comme a.bo.go
. C'est mieux si vos noms de fichiers peuvent en contenir plusieurs .
:
find . -type f | grep -P '/.{1}\.[^.]+$'
REMARQUE: La solution ci-dessus suppose que vous avez des noms de fichiers relativement sains qui ne contiennent pas de nouveaux caractères de ligne, etc. Si l'un de ces problèmes pose problème, faites-le moi savoir et je mettrai à jour ma réponse.
a.go
est un nom de fichier de longueur 4.a
est un nom de fichier de longueur 1. C'est Unix, pas DOS où le nom et l'extension étaient séparés et un implicite.
faisait toujours partie du nom de fichier.