web-dev-qa-db-fra.com

Trouver tous les fichiers dont le nom contient une chaîne

Je cherchais une commande qui renverrait des fichiers du répertoire actuel contenant une chaîne dans le nom du fichier. J'ai vu les commandes locate et find pouvant rechercher des fichiers commençant par quelque chose first_Word* ou se terminant par quelque chose *.jpg.

Comment puis-je retourner une liste de fichiers contenant une chaîne dans le nom du fichier?

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

Comment pourrais-je renvoyer ce fichier et d'autres contenant la chaîne touch? Utilisation d'une commande telle que find '/touch/'

149
Dru

Utilisez find:

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

Il trouvera tous les fichiers dans le répertoire actuel (supprimez maxdepth 1 si vous voulez le rendre récursif) contenant "chaîne" et l’imprimera à l’écran.

Si vous voulez éviter le fichier 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 si vous ne voulez pas vérifier le contenu du fichier), vous pouvez utiliser:

ls | grep touch

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

247
Zagorax

Utilisez grep comme suit:

grep -R "touch" .

-R signifie récidive. Si vous préférez ne pas aller dans les sous-répertoires, ignorez-le.

-i signifie "ignorer la casse". Vous trouverez peut-être que cela vaut la peine d'essayer.

13
carlspring

L'option -maxdepth devrait précéder l'option -name, comme ci-dessous.,

find . -maxdepth 1 -name "string" -print
4
Sunil Dias
find $HOME -name "hello.c" -print

Ceci recherchera dans tout le système $HOME (c'est-à-dire /home/username/) tous les fichiers nommés "hello.c" et affichera leur chemin d'accès:

/Users/user/Downloads/hello.c
/Users/user/hello.c

Cependant, il ne correspondra pas à HELLO.C ou HellO.C. Pour que la correspondance soit sensible à la casse, transmettez l’option -iname comme suit:

find $HOME -iname "hello.c" -print

Exemples de sortie:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Passez l’option -type f pour ne rechercher que les fichiers:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

-iname fonctionne sur la commande de recherche de version GNU ou BSD (y compris OS X). Si votre version de la commande find ne prend pas en charge -iname, essayez la syntaxe suivante à l'aide de la commande grep:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

OU essayez

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Exemples de sortie:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
2
shilovk
grep -R "somestring" | cut -d ":" -f 1
0
Saurabh kukade

Une alternative aux nombreuses solutions déjà fournies consiste à utiliser le glob **. Lorsque vous utilisez bash avec l'option globstar (shopt -s globstar) ou si vous utilisez zsh, vous pouvez simplement utiliser le glob ** pour cela.

**/bar

effectue une recherche récursive dans le répertoire pour les fichiers nommés bar (incluant éventuellement le fichier bar dans le répertoire en cours). Remarquez que cela ne peut pas être combiné avec d'autres formes de déplacement dans le même segment de chemin; dans ce cas, les opérateurs * retrouvent leur effet habituel.

Notez qu'il existe une différence subtile entre zsh et bash ici. Alors que bash traversera des liens symboliques vers des répertoires, zsh ne le fera pas. Pour cela, vous devez utiliser le glob ***/ dans zsh.

0
kvantour
find / -exec grep -lR "{test-string}" {} \;
0
Shahid

Si la chaîne est au début du nom, vous pouvez le faire

$ compgen -f .bash
.bashrc
.bash_profile
.bash_Prompt
0
Steven Penny