Rechercher des fichiers par la longueur du nom de fichier

10

Je veux trouver tous les fichiers par longueur des noms de fichiers.

Par exemple , si je veux trouver des fichiers de longueur 1, tels que a.go, b.go.

Je mets:

grep '.\{1\}' file

Mais cela ne fonctionne pas. Quelle commande puis-je utiliser pour rechercher des fichiers par longueur de nom de fichier?

EPSILONsdfsdfdsf
la source
a.goest un nom de fichier de longueur 4. aest 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.
Peter Cordes

Réponses:

3

greprecherche des modèles dans le contenu des fichiers. Si vous voulez regarder les noms des fichiers, vous pouvez simplement utiliser un glob de shell (si vous ne voulez considérer que les noms de fichiers dans le répertoire courant):

echo ?.go

(Au fait, c'est le shell qui évalue le glob, pas la echocommande.)

Si vous souhaitez rechercher récursivement dans les répertoires, en commençant par le répertoire courant, l'outil à utiliser est find:

find . -name '?.go'

(Notez que vous devez citer le modèle pour empêcher le shell de l'évaluer en tant que glob avant d' findêtre invoqué.)

200_success
la source
1
Cela trouvera également des répertoires qui correspondent également au modèle «? .Go».
slm
@slm, les répertoires sont l'un des nombreux types de fichiers, l'OP n'a pas spécifié le type de fichiers qu'il recherchait.
Stéphane Chazelas
8

Si vous souhaitez simplement trouver les noms de fichiers, vous pouvez utiliser la commande suivante:

find -exec basename '{}' ';' | egrep '^.{100,}$'

Cela s'exécutera find, extraira le nom du fichier ou du répertoire à l'aide de basename, puis recherchera tout nom de fichier ou nom de répertoire d'au moins 100 caractères. Si vous souhaitez trouver un nom de fichier d'une longueur exacte, utilisez {100}plutôt que {100,}.

Si vous souhaitez trouver les noms de fichiers, y compris le chemin, procédez comme suit:

find | egrep '/[^/]{100,}$'

Cela renverra le nom de fichier, y compris le chemin d'accès relatif à l'emplacement où vous avez exécuté la commande find.

Doug Harple
la source
3

Tout d'abord, greprecherche 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 sedcommande supprime simplement le ./. Le -Pdrapeau 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.

terdon
la source
1

Vous ne spécifiez pas, mais si les fichiers se trouvent dans une structure de répertoires, vous pouvez utiliser findpour localiser les fichiers de longueur 1, à l'aide de grep:

$ find . -type f  | grep -P '/.{1}\.'

Exemple

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c
slm
la source
Sur MacOS X, utilisez egrep et supprimez l'option -P
Bart Kummel
@BartKummel - en fait sur OSX j'utilise ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Sachez également que ce Q n'a pas été marqué comme OSX, donc l'utilisation de grepest appropriée.
slm
1

J'utiliserais quelque chose comme ça.

find . -type f -name "?.go"

Donc, si vous mettez deux "?" alors vous recherchez des noms de fichier avec deux caractères et l'extension.

Purinda Gunasekara
la source
0

Lorsque vous souhaitez utiliser une expression régulière dans la commande find, vous devez utiliser ""par exemple:

find /var/log -iname "*.err" 

pour votre cas d'utilisation:

find yourpath -type f -a -name "?.go"

Vous devez remplacer votre chemin réel avec YourPath, des -amoyens And -type fsignifie que vous êtes à la recherche uniquement pour les fichiers réguliers.

? dans votre requête signifie un caractère tel que DOS si vous vous en souvenez.

Golfe Persique
la source
-1

ls ?.* devrait vous donner les résultats souhaités.

Nitin Gupta
la source
bienvenue sur Unix.SE. Il n'est malheureusement pas utile d'ajouter des réponses à d'anciennes questions qui contiennent déjà de nombreuses bonnes réponses. (À moins qu'il n'y ait une nouvelle meilleure façon de résoudre un ancien problème, ou que vous ayez une meilleure solution que n'importe laquelle des anciennes réponses.) Si vous voulez répondre à certaines questions, regardez les nouvelles questions sur la première page.
Peter Cordes