269 votes

Trouver tous les fichiers dont le nom contient une chaîne de caractères

J'ai cherché une commande qui renvoie les fichiers du répertoire actuel dont le nom contient une chaîne de caractères. J'ai vu locate y find qui peuvent trouver des fichiers commençant par quelque chose first_word* ou se terminant par quelque chose *.jpg .

Comment puis-je renvoyer une liste de fichiers contenant une chaîne de caractères dans le nom du fichier ?

Par exemple, si 2012-06-04-touch-multiple-files-in-linux.markdown était un fichier dans le répertoire courant.

Comment pourrais-je renvoyer ce fichier et d'autres contenant la chaîne de caractères touch ? En utilisant une commande telle que find '/touch/'

461voto

Zagorax Points 3213

Utilisez find :

find . -maxdepth 1 -name "*string*" -print

Il trouvera tous les fichiers dans le répertoire actuel (supprimer maxdepth 1 si vous le voulez récursif) contenant "string" et l'imprimera à l'écran.

Si vous voulez éviter les fichiers contenant ':', vous pouvez taper :

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Si vous voulez utiliser grep (mais je pense que ce n'est pas nécessaire dans la mesure où vous ne voulez pas vérifier le contenu du fichier) vous pouvez utiliser :

ls | grep touch

Mais, je répète, find est une solution meilleure et plus propre pour votre tâche.

7 votes

@Dru, si vous voulez qu'il soit plus court, vous pouvez éviter -print car c'est le comportement par défaut et . car c'est le dossier par défaut où il vérifie.

0 votes

Génial. Je me vois utiliser ça souvent. Je vais prendre votre -print y . des suggestions de suppression, en faire une commande, et essayer de faire passer *string* en tant qu'argument de ligne de commande.

2 votes

find . -name "*string*" Il fonctionne aussi très bien. Suppression de . jette une erreur de mon côté. Merci encore @Zagorax.

25voto

carlspring Points 7885

Utilisez grep comme suit :

grep -R "touch" .

-R signifie récuser. Si vous préférez ne pas aller dans les sous-répertoires, passez votre chemin.

-i signifie "ignorer le cas". Cela vaut peut-être la peine d'essayer aussi.

0 votes

Super. J'ai remarqué que le contenu de certains fichiers suit un : . Est-il possible de ne pas le faire ? En utilisant une option peut-être ?

1 votes

Essayez : grep -R "touch" . | cut -d ":" -f 2

1 votes

Cela semble produire uniquement le contenu des fichiers. Vous avez essentiellement répondu à ma question cependant, je peux essayer de faire quelques recherches pour retenir le contenu.

7voto

Sunil Dias Points 1

El -maxdepth doit se trouver avant l'option -name option, comme ci-dessous.,

find . -maxdepth 1 -name "string" -print

3 votes

Vous devez mettre * avant et après la "chaîne".

0voto

Steven Penny Points 18523

Si la chaîne de caractères se trouve au début du nom, vous pouvez procéder ainsi

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

4 votes

compgen n'est pas un marteau approprié pour ce clou. Cet outil peu utilisé est conçu pour répertorier Commandes disponibles et, en tant que tel, il liste les fichiers dans le répertoire actuel (qui pourrait être scripts) et il ne peut ni faire de récursion, ni regarder au-delà du début d'un nom de fichier, ni rechercher le contenu d'un fichier, ce qui le rend pratiquement inutile.

0voto

SystematicFrank Points 3014

Si vous utilisez zsh, vous pouvez simplement taper :

ls **/*touch*

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X