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 ..?

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

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 :)


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.