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.


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

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


8

Une autre option est disponible ici :

du -sm .[!.]* *

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*/.*/


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 {} \;
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.