Comment faire correspondre * avec des fichiers cachés dans un répertoire

21

Comment faire correspondre les fichiers cachés à l'intérieur des répertoires donnés

par exemple

Si je donne la commande ci-dessous, elle ne donne pas le résultat des fichiers cachés,

 du -b maybehere*/*

comment réaliser ce simple en utilisant une seule commande au lieu d'utiliser

du -b maybehere*/.* maybehere*/*

car j'ai besoin de taper peut-être ici deux fois.

vidhan
la source
Essayez pour juste caché maybehere*/.*et ajoutez à ci-dessus pour tous
Costas
1
Votre modification crée une nouvelle question avec des restrictions supplémentaires, ce qui fait du Q une cible mobile, invalidant éventuellement la ou les réponses déjà données. Ce sont de mauvaises manières, posez simplement une nouvelle question si vous en avez une.
Anthon

Réponses:

22

Profitez de l'expansion de l'accolade:

du -b maybehere*/{*,.[^.],.??*}

Ou bien

du -b maybehere*/{,.[^.],..?}*

La logique derrière cela n'est probablement pas évidente, alors voici l'explication:

  • * correspond à tous les fichiers non masqués
  • .[^.]correspond aux fichiers dont les noms commencent par un seul point suivi d'un pas de point; qui ne sont que 2 noms de fichiers de caractères dans le premier formulaire.
  • .??* correspond aux fichiers cachés qui contiennent au moins 3 caractères
  • ..?* comme ci-dessus, mais le deuxième caractère doit être un point

Le but est d'exclure les liens durs vers le répertoire courant et parent ( .et ..), mais d' inclure tous les fichiers normaux de telle manière que chacun d'eux ne sera compté qu'une seule fois!

Par exemple, le plus simple serait d'écrire simplement

du -b maybehere*/{.,}*

Cela signifie que la liste contient un point .et "rien" (rien n'est entre ,et se fermant }), donc tous les fichiers cachés (qui commencent à partir d'un point) et tous les fichiers non cachés (qui partent de "rien") correspondraient. Le problème est que cela correspondrait également .et .., et ce n'est probablement pas ce que vous voulez, nous devons donc l'exclure d'une manière ou d'une autre.


Un dernier mot sur l'expansion de l'accolade.

L'expansion d'accolade est un mécanisme par lequel vous pouvez inclure plus de fichiers / chaînes / quoi que ce soit sur la ligne de commande en écrivant moins de caractères. La syntaxe est {word1,word2,...}, c'est-à-dire qu'il s'agit d'une liste de chaînes séparées par des virgules qui commence {et se termine par }. bashmanuel donne un exemple d'utilisation très basique et en même temps très courant:

$ echo a{b,c,d}e
abe ace ade
jimmij
la source
à quoi sert le { }je n'ai aucune idée :( pouvez-vous me donner une direction pour obtenir plus d'informations à ce sujet
vidhan
@vidhan voir l'édition et regardez le man bashchapitre "Expansion de l'accolade".
jimmij
Pourriez-vous me donner plus d'explications sur ce qui précède et expliquer un peu plus clairement comment tout fonctionne comme je suis nouveau avec ces choses @jimmij
vidhan
6
.??*ne correspond pas .a, .b... .[^.]*ne correspond pas ..foo.
Stéphane Chazelas
4
.foocorrespond à la fois à .[^.]*et .??*. Tu veux {.[!.],..?,}*.
Stéphane Chazelas
14

Puisque vous utilisez déjà la syntaxe spécifique à GNU ( -b):

du -abd1 maybehere*/

De cette façon, c'est la duliste des fichiers dans les maybehere*répertoires (et cela n'exclut pas les fichiers dot). -d1limite le rapport d'utilisation du disque à un niveau inférieur (y compris les non-répertoires avec -a).

Sinon, pour que les globs incluent des fichiers cachés (sauf .et ..), chaque shell a sa propre syntaxe:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    bien qu'il fasse attention .et ..sur les systèmes qui les incluent, ce readdir()qui le rend difficilement utilisable.

Stéphane Chazelas
la source
8

Une autre option est disponible ici :

du -sm .[!.]* *
Fábio
la source
Pourquoi voudriez-vous ignorer les noms de fichiers commençant par ..?
Kusalananda
2
Vraisemblablement, parce qu'ils ne veulent pas tout énumérer dans ../et en dessous.
Shadur
Cela ne compte pas les fichiers comme par exemple ..myfile; ajouter ..?*pour cela. Mais +1 pour utiliser la syntaxe Glob appropriée pour les correspondances négatives.
Pedro Gimeno
0

Si vous voulez simplement lister les répertoires cachés ou opérer sur des répertoires cachés, comme Costas l'a dit, vous pouvez utiliser

du -b maybehere*/.*

Cela vous permettra d'opérer sur des fichiers et répertoires cachés. Si vous ne voulez que des répertoires cachés, vous pouvez spécifier cela avec

du -b maybehere*/.*/

SailorCire
la source
pouvez-vous s'il vous plaît revoir la question @SailorCire Je l'ai un peu édité
vidhan
@vidhan donc vous ne voulez travailler que caché dans un répertoire? Est-ce exact?
SailorCire
non, je veux faire correspondre les fichiers cachés et non cachés à l'intérieur d'un seul répertoire au lieu d'utiliser à la fois du maybehere*/.*et maybehere*/*un de caché et un autre pour non caché
vidhan
@vidhan du -bramasse à la fois caché et non caché.
SailorCire
non :( malheureusement @SailorCire
vidhan
0

Bien que ne pas shell directement, vous pouvez utiliser find avec une profondeur limitée comme celle-ci

find maybehere -maxdepth 1 -exec du -sh {} \;
k3a
la source