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.
maybehere*/.*
et ajoutez à ci-dessus pour tousRéponses:
Profitez de l'expansion de l'accolade:
Ou bien
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 pointLe 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
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}
.bash
manuel donne un exemple d'utilisation très basique et en même temps très courant:la source
{ }
je n'ai aucune idée :( pouvez-vous me donner une direction pour obtenir plus d'informations à ce sujetman bash
chapitre "Expansion de l'accolade"..??*
ne correspond pas.a
,.b
....[^.]*
ne correspond pas..foo
..foo
correspond à la fois à.[^.]*
et.??*
. Tu veux{.[!.],..?,}*
.Puisque vous utilisez déjà la syntaxe spécifique à GNU (
-b
):De cette façon, c'est la
du
liste des fichiers dans lesmaybehere*
répertoires (et cela n'exclut pas les fichiers dot).-d1
limite 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
:ksh93
:bash
:tcsh
:yash
:bien qu'il fasse attention
.
et..
sur les systèmes qui les incluent, cereaddir()
qui le rend difficilement utilisable.la source
Une autre option est disponible ici :
la source
..
?../
et en dessous...myfile
; ajouter..?*
pour cela. Mais +1 pour utiliser la syntaxe Glob appropriée pour les correspondances négatives.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*/.*/
la source
maybehere*/.*
etmaybehere*/*
un de caché et un autre pour non cachédu -b
ramasse à la fois caché et non caché.Bien que ne pas shell directement, vous pouvez utiliser find avec une profondeur limitée comme celle-ci
la source