web-dev-qa-db-fra.com

Comment dois-je glob pour tous les fichiers cachés?

Je veux effectuer une action (disons chown) sur tous les fichiers cachés dans un répertoire.

Je sais que ce .* est pas une bonne idée car il trouvera également les répertoires . et parent .. actuels (je sais que rm ne fonctionnera pas avec . et .., mais d’autres commandes, notamment chown et chmod , heureusement prendra effet)

Mais tous mes fichiers cachés ont des noms différents!

Comment dois-je parcourir pour tous les fichiers cachés en excluant . et ..?

22
Zanna

Vous pouvez utiliser le modèle extglob suivant:

.@(!(.|))
  • . correspond à un littéral . au début

  • @() est un modèle extglob, correspond à l'un des modèles à l'intérieur, car nous n'avons qu'un seul modèle à l'intérieur, il choisira

  • !(.|) est un autre modèle extglob (imbriqué), qui correspond à tout fichier ne contenant aucun ou un .; Comme nous avons déjà apparié . au début, ce modèle entier correspond à tous les fichiers commençant par . à l'exception de . et de ...

extglob est activé sur les sessions interactives de bash par défaut sous Ubuntu. Sinon, activez-le d'abord:

shopt -s extglob

Exemple:

$ echo .@(!(.|))
.bar .foo .spam
20
heemayl
 GLOBIGNORE=".:.."

cacher le. et .. répertoires. Cela définit également l'option dotglob: * correspond aux fichiers cachés et non cachés.

Vous pouvez aussi faire

shopt -s dotglob

Gilles:)

20
Rinzwind

Vous pouvez utiliser une commande find ici. Par exemple, quelque chose comme

find -type f -name ".*" -exec chmod 775 {} \;

Cela va trouver les fichiers cachés et changer les permissions


Modifier pour inclure le commentaire de @gerrit:

find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;

Cela limitera la recherche en haut du répertoire en cours au lieu d'une recherche récursive.

9
Wayne_Yux