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

22

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

Je sais que ce .*n'est pas une bonne idée car il trouvera également les répertoires actuels .et parents ..(je sais que rmcela ne fonctionnera pas .et ..mais d'autres commandes, y compris chownet chmod, prendront heureusement effet)

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

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

Zanna
la source

Réponses:

20

Vous pouvez utiliser le extglobmodèle suivant :

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

  • @()est un extglobmotif, correspondra à l'un des motifs à l'intérieur, car nous n'avons qu'un seul motif à l'intérieur, il choisira

  • !(.|)est un autre extglobmodèle (imbriqué), qui correspond à tout fichier sans ou avec un .; Comme nous l'avons .déjà fait au début, ce modèle entier correspondra à tous les fichiers commençant par .sauf .et ...

extglobest activé sur les sessions interactives de bashpar défaut dans Ubuntu. Sinon, activez-le d'abord:

shopt -s extglob

Exemple:

$ echo .@(!(.|))
.bar .foo .spam
heemayl
la source
C'est clairement une chose géniale que je dois apprendre! Merci d'avoir enseigné
Zanna
@Zanna Heureuse d'avoir pu aider :)
heemayl
2
Quel est le but de la @()? Le simple .!(.|)semble fonctionner à l'identique.
Kyle Strand
1
Je sais que c'est vieux, mais j'ai la même question que @KyleStrand. Dans mes tests, !(.|)fonctionne de la même manière. Y a-t-il un objectif derrière @()dans ce contexte?
Paddy Landau
Le caractère de coup est-il une négation? Il n'est pas mentionné, et à la lecture de votre explication, j'ai l'impression que le motif correspond au point et au double point, mais vous décrivez clairement les fichiers qui correspondent à un point de départ, à l'exception de ces deux.
utilisateur inconnu
20
 GLOBIGNORE=".:.."

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

Vous pouvez aussi faire

shopt -s dotglob

Gilles :)

Rinzwind
la source
9

Vous pouvez utiliser une findcommande ici. Par exemple quelque chose comme

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

Cela trouvera des fichiers cachés et modifiera les autorisations


Modifiez pour inclure le commentaire de @gerrit:

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

Cela limitera la recherche dans le répertoire actuel au lieu de rechercher récursivement.

Wayne_Yux
la source
4
Vous voudrez peut-être ajouter un -maxdepth 1ici pour qu'il corresponde mieux au comportement de la question et des autres réponses.
gerrit