Come abbinare * con file nascosti all'interno di una directory


21

Come abbinare i file nascosti all'interno delle directory indicate

per esempio

Se do il comando seguente non fornisce il risultato dei file nascosti,

 du -b maybehere*/*

come ottenere questo semplice usando un singolo comando invece di usare

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

come ho bisogno di digitare forse due volte.


Prova solo per nascosto maybehere*/.*e aggiungi sopra per tutti
Costas

1
La tua modifica pone una nuova domanda con ulteriori restrizioni, che trasforma la Q in un bersaglio mobile, invalidando le risposte già fornite. Sono cattive maniere, basta fare una nuova domanda se ne hai una.
Anthon,

Risposte:


22

Approfitta dell'espansione del controvento:

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

o in alternativa

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

La logica dietro questo non è probabilmente ovvia, quindi ecco la spiegazione:

  • * corrisponde a tutti i file non nascosti
  • .[^.]corrisponde ai file i cui nomi sono iniziati con un singolo punto seguito da non un punto; che sono solo 2 nomi di file di caratteri nella prima forma.
  • .??* corrisponde a file nascosti che contengono almeno 3 caratteri
  • ..?* come sopra, ma il secondo carattere deve essere un punto

Il punto è escludere i collegamenti reali alla directory corrente e parent ( .e ..), ma includere tutti i file normali in modo tale che ciascuno di essi venga conteggiato una sola volta!

Ad esempio, il più semplice sarebbe scrivere

du -b maybehere*/{.,}*

Significa che l'elenco contiene un punto .e "niente" (nulla è compreso tra ,e in chiusura }), quindi tutti i file nascosti (che iniziano da un punto) e tutti i file non nascosti (che iniziano da "niente") corrisponderebbero. Il problema è che anche questo corrisponderebbe .e .., e molto probabilmente non è quello che vuoi, quindi dobbiamo escluderlo in qualche modo.


Parola finale sull'espansione del tutore.

L'espansione di parentesi graffe è un meccanismo mediante il quale è possibile includere più file / stringhe / qualunque cosa sulla riga di comando scrivendo meno caratteri. La sintassi è {word1,word2,...}, cioè è un elenco di stringhe separate da virgola che inizia {e finisce con }. bashil manuale fornisce un esempio molto semplice e allo stesso tempo molto comune di utilizzo:

$ echo a{b,c,d}e
abe ace ade

a che serve il { }non ne ho idea :( puoi darmi una direzione per avere maggiori informazioni a riguardo
vidhan,

@vidhan guarda la modifica e guarda il man bashcapitolo "Espansione del tutore ".
Jimmij,

ti dispiacerebbe darmi maggiori spiegazioni per quanto sopra e spiegare un po 'più chiaramente spiegando come tutto funziona come sono nuovo con queste cose @jimmij
vidhan

6
.??*non riesce ad abbinare .a, .b... .[^.]*non riesce ad abbinare ..foo.
Stéphane Chazelas,

4
.foocorrisponde a entrambi .[^.]*e .??*. Tu vuoi {.[!.],..?,}*.
Stéphane Chazelas,

14

Dato che stai già utilizzando la sintassi specifica GNU ( -b):

du -abd1 maybehere*/

In questo modo, è duquello che elenca i file nelle maybehere*directory (e non esclude i file punto). -d1limita la segnalazione dell'utilizzo del disco a un livello inferiore (comprese le non directory con -a).

Altrimenti, affinché globs includa file nascosti (tranne .e ..), ogni shell ha la sua sintassi:

  • 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*/*)

    anche se attenzione include .e ..sui sistemi che li includono nel risultato readdir() che lo rende difficilmente utilizzabile.


8

Un'altra opzione è disponibile qui :

du -sm .[!.]* *

Perché dovresti saltare i nomi dei file a partire da ..?
Kusalananda

2
Presumibilmente, perché non vogliono elencare tutto dentro ../e sotto.
Shadur,

Questo non conta i file come ad esempio ..myfile; aggiungere ..?*per quello. Ma +1 per l'utilizzo della sintassi globale corretta per le corrispondenze negative.
Pedro Gimeno,

0

Se vuoi solo elencare le directory nascoste o operare su directory nascoste, come Costas ha detto che puoi usare

du -b maybehere*/.*

Ciò ti consentirà di operare su file e directory nascosti. Se vuoi solo directory nascoste, puoi specificarlo con

du -b maybehere*/.*/


puoi per favore vedere di nuovo la domanda @SailorCire L'ho modificata un po '
vidhan,

@vidhan quindi vuoi solo lavorare nascosto all'interno di una directory? È corretto?
SailorCire,

no Voglio abbinare sia i file nascosti che quelli non nascosti all'interno di una directory invece di usare sia du maybehere*/.*che maybehere*/*uno di hidden e un altro per non nascosto
vidhan

@vidhan du -braccoglie sia nascosto che non nascosto.
SailorCire,

no :( purtroppo @SailorCire
vidhan,

0

Pur non eseguendo direttamente la shell, puoi usare find con una profondità limitata come questa

find maybehere -maxdepth 1 -exec du -sh {} \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.