Je lance la commande pour rechercher une phrase dans tous les fichiers:
cat *.* | grep blabla
Cela fonctionne bien, mais je rencontre un problème avec les fichiers cachés et les répertoires. Le commandement ne traite tout simplement pas avec eux. Ho pour résoudre ce problème?
Par défaut, les fichiers cachés (c'est-à-dire ceux commençant par un point) sont exclus de l'expansion globale du bash Shell. Cependant, vous pouvez modifier cela à l'aide du paramètre dotglob
, par exemple.
$ mkdir dir
$ touch dir/.hidden dir/visible
$ echo dir/*
dir/visible
$ shopt -s dotglob
$ echo dir/*
dir/.hidden dir/visible
Vous pouvez ensuite désélectionner l'option avec shopt -u dotglob
Utiliser la commande find
avec un indicateur logique OR (-o
) et un indicateur -exec . . .\+
find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "MySearchTerm" {} \+
Explication:
find
est une commande récursive qui recherche les fichiers dans le répertoire spécifié. Dans ce cas, il s'agit de .
le répertoire de travail en cours.-maxdepth
flag nous dit de rester uniquement dans le répertoire en cours. Si vous voulez aller de manière récursive ou spécifier le nombre de sous-répertoires à descendre, remplacez 1
par le nombre de niveaux souhaités.\( . . .\)
empêche Shell de traiter cela comme un sous-shell, mais plutôt comme un regroupement d'arguments en find
.-iname
permettent de spécifier les noms de fichiers à rechercher.-o
flag indiquera à find de rechercher des fichiers *.*
ou des fichiers commençant par un point initial, les fichiers cachés.-exec . . .{}
permet d’exécuter une commande spécifique sur les fichiers trouvés. \+
indiquera à find
de prendre tous les fichiers en tant qu'arguments de la commande à exécuter, dans ce cas grep
.Voici un petit exemple où vous pouvez voir que SEARCHFILE.txt
et .SEARCHFILE.txt
se trouvent tous les deux:
DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "HelloWorld" {} \+ 2>/dev/null
./SEARCHFILE.txt:HelloWorld ! I'm found
./localDir.txt:HelloWorld.so
./localDir.txt:HelloWorld.c
Binary file ./2015-05-05-raspbian-wheezy.img matches
./.SEARCHFILE.txt:HelloWorld ! I'm found
Les "fichiers cachés" sont simplement des fichiers dont le nom commence par un point. Dans les applications graphiques, ces fichiers ne sont généralement pas affichés, d'où leur nom.
Vous pouvez utiliser shell globbing :
cat {*,.*} | grep blabla
La commande précédente inclut tous les fichiers sans point (*
) et tous les fichiers commençant par un point (.*
).
À propos, il s'agit d'un tilisation inutile de cat , et vous devriez plutôt écrire votre commande sous la forme:
grep blabla {*,.*}