web-dev-qa-db-fra.com

Exécuter des commandes sur des fichiers cachés

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?

4
vico

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

7
steeldriver

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.
  • La partie \( . . .\) empêche Shell de traiter cela comme un sous-shell, mais plutôt comme un regroupement d'arguments en find.
  • Les indicateurs -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.
  • La structure -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
3
Sergiy Kolodyazhnyy

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 {*,.*} 
3
dr01