J'ai recherché une commande qui renverra des fichiers du répertoire actuel contenant une chaîne dans le nom de fichier. Je l' ai vu locate
et les find
commandes qui peuvent trouver les 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 dans le nom de fichier?
Par exemple, si 2012-06-04-touch-multiple-files-in-linux.markdown
était un fichier dans le répertoire courant.
Comment pourrais-je retourner ce fichier et d'autres contenant la chaîne touch
? En utilisant une commande telle quefind '/touch/'
man grep
, la seconde avecman find
. pourquoi voulez-vous google au lieu d'utiliser l'homme, je ne sais pas.Réponses:
Utilisez
find
:find . -maxdepth 1 -name "*string*" -print
Il trouvera tous les fichiers dans le répertoire courant (supprimez
maxdepth 1
si vous le souhaitez récursif) contenant "string" et l'imprimera à l'écran.Si vous voulez éviter le fichier contenant ':', vous pouvez taper:
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
Si vous souhaitez utiliser
grep
(mais je pense que ce n'est pas nécessaire dans la mesure où vous ne souhaitez pas vérifier le contenu du fichier), vous pouvez utiliser:ls | grep touch
Mais, je le répète,
find
c'est une solution meilleure et plus propre pour votre tâche.la source
find
est un outil très puissant, il doit être en quelque sorte «long». :)-print
car c'est le comportement par défaut et.
comme c'est le dossier par défaut où il vérifie.find . -name "*string*"
Fonctionne très bien aussi. La suppression.
jette une erreur de ma part. Merci encore @Zagorax.Utilisez grep comme suit:
-R
signifie récurer. Si vous préférez ne pas aller dans les sous-répertoires, ignorez-le.-i
signifie "ignorer la casse". Cela vaut peut-être la peine d'être essayé.la source
:
. Y a-t-il un moyen de retenir cela? Vous utilisez une option peut-être?grep -R "touch" . | cut -d ":" -f 2
grep -R "touch" . | cut -d ":" -f 1
(désolé doit vous avoir mal lu).grep
retourne des fichiers avec le contenu et les noms de fichiers contenanttouch
ou le contenu contenanttouch
, je ne sais pas encore ce qui est le cas. De la liste des fichiers renvoyés, la moitié contienttouch
dans le titre et l'autre moitiétouch
dans le corps, pas le titre. Je viens de m'en rendre compte.L'
-maxdepth
option doit être avant l'-name
option, comme ci-dessous.,la source
Cela recherchera dans tout le système
$HOME
(c'est-à-dire/home/username/
) tous les fichiers nommés «hello.c» et affichera leurs chemins:Cependant, il ne correspondra pas
HELLO.C
ouHellO.C
. Pour faire correspondre est insensible à la casse, passez l'-iname
option comme suit:Exemples de sorties:
Passez l'
-type f
option pour rechercher uniquement les fichiers:Cela
-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 lagrep
commande:OU essayez
Exemples de sorties:
la source
Si la chaîne est au début du nom, vous pouvez le faire
la source
compgen
n'est pas un marteau approprié pour ce clou. Cet outil peu utilisé est conçu pour lister les commandes disponibles , et en tant que tel, il répertorie les fichiers dans le répertoire courant (qui pourraient être des scripts) et il ne peut ni récurer ni regarder au-delà du début d'un nom de fichier ni rechercher le contenu d'un fichier, ce qui le rend surtout inutile.Une alternative aux nombreuses solutions déjà proposées consiste à utiliser le glob
**
. Lorsque vous utilisezbash
avec l'optionglobstar
(shopt -s globstar
) ou que vous utilisezzsh
, vous pouvez simplement utiliser le glob**
pour cela.effectue une recherche récursive dans le répertoire des fichiers nommés
bar
(y compris potentiellement le fichierbar
dans le répertoire courant). Remarquez que cela ne peut pas être combiné avec d'autres formes de globbing dans le même segment de chemin; dans ce cas, les*
opérateurs reviennent à leur effet habituel.Notez qu'il existe une différence subtile entre
zsh
etbash
ici. Tandis quebash
traversera les liens souples vers les répertoires,zsh
non. Pour cela, vous devez utiliser le glob***/
inzsh
.la source
la source
la source