Come devo glob per tutti i file nascosti?


22

Voglio eseguire alcune azioni (diciamo chown) su tutti i file nascosti in una directory.

So che questa non.* è una buona idea perché troverà anche le directory correnti e parent (so che non funzionerà e che altri comandi, incluso e , avranno felicemente effetto)...rm...chownchmod

Ma tutti i miei file nascosti hanno nomi diversi!

Come devo glob per tutti i file nascosti escludendo .e ..?

Risposte:


20

È possibile utilizzare il extglobmodello seguente :

.@(!(.|))
  • .corrisponde letteralmente .all'inizio

  • @()è uno extglobschema, corrisponderà a uno degli schemi all'interno, poiché abbiamo solo uno schema al suo interno, lo sceglierà

  • !(.|)è un altro extglobmodello (nidificato), che corrisponde a qualsiasi file con nessuno o uno .; Come abbiamo già abbinato .all'inizio, l'intero modello corrisponderà a tutti i file che iniziano con .tranne .e ...

extglobè abilitato su sessioni interattive di bashdefault in Ubuntu. In caso contrario, abilitalo prima:

shopt -s extglob

Esempio:

$ echo .@(!(.|))
.bar .foo .spam

Questa è chiaramente una cosa fantastica che devo imparare! Grazie per l'insegnamento
Zanna,

@Zanna Sono felice di poterti aiutare :)
heemayl,

2
Qual è lo scopo di @()? Semplice .!(.|)sembra funzionare in modo identico.
Kyle Strand,

1
So che questo è vecchio, ma ho la stessa domanda di @KyleStrand. Nei miei test, !(.|)funziona allo stesso modo. C'è qualche scopo dietro @()in questo contesto?
Paddy Landau,

Il personaggio del botto è una negazione? Non è menzionato, e leggendo la tua spiegazione, ho l'impressione che il modello corrisponda a punto e doppio, ma descrivi chiaramente i file che corrispondono a un punto iniziale, tranne quelli.
utente sconosciuto

20
 GLOBIGNORE=".:.."

per nascondere il. e ... directory. Questo imposta anche l' dotglobopzione: *corrisponde sia ai file nascosti che a quelli non nascosti.

Puoi anche fare

shopt -s dotglob

Gilles :)


9

Puoi usare un findcomando qui. Ad esempio qualcosa del genere

find -type f -name ".*" -exec chmod 775 {} \;

Questo troverà i file nascosti e cambierà le autorizzazioni


Modifica per includere il commento di @gerrit:

find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;

Ciò limiterà la ricerca all'inizio della directory corrente invece di cercare ricorsivamente.


4
Potresti voler aggiungere un -maxdepth 1qui affinché corrisponda più da vicino al comportamento nella domanda e alle altre risposte.
Gerrit,
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.