Cosa significa. ?? * in un comando shell?


22

Il seguente comando tar"doterà" tutti i file e le cartelle:

tar -zcvf dotfiles.tar.gz .??*

Conosco le espressioni regolari , ma non capisco come interpretare .??*. Ho eseguito ls .??*e tree .??*guardato i file che erano elencati. Perché questa espressione regolare include tutti i file all'interno di cartelle che iniziano .per esempio?


Risposte:


32

I globi non sono espressioni regolari. In generale, la shell tenterà di interpretare qualsiasi cosa digiti sulla riga di comando che non citi come glob. Le conchiglie non sono affatto necessarie per supportare le espressioni regolari (anche se in realtà molte delle più fantasiose più moderne lo fanno, ad esempio l' =~operatore di regex match nel bash [[costrutto).

Il .??*è un glob. Corrisponde a qualsiasi nome di file che inizia con un punto letterale ., seguito da due caratteri (non necessariamente uguali) ??, seguito dall'equivalente dell'espressione regolare [^/]*, ovvero 0 o più caratteri che non lo sono /.

Per i dettagli completi dell'espansione del percorso della shell (il nome completo di "globbing"), vedere le specifiche POSIX .


10
Punto aggiuntivo: questo è un tentativo di scrivere un glob che corrisponde a tutti i dotfile in una directory tranne le voci speciali .e con ..cui normalmente non si vuole fare nulla. Non è del tutto corretto; non raccoglie nulla chiamato ' .X' dove X è un personaggio diverso da punto. Non penso sia possibile scrivere un singolo glob che corrisponda a tutti i dotfile tranne .e .., ma puoi farlo con due: tar zcvf dotfiles.tar.gz .[!.] .??*ad esempio.
zwol,

@Zack: grazie per il chiarimento. Ho pubblicato un commento a riguardo, ma poi l'ho eliminato. ls .?restituito come ls .., il che significa che non c'erano altre voci nella cartella corrispondenti al modello .?. Avrei fatto .[^.]per tutti i .?file diversi da ...
SabreWolfy,

2
@SabreWolfy Se leggi attentamente le specifiche POSIX, questa è in realtà una differenza importante tra globs e regex: nelle espressioni parentesi, [^abc]nella sintassi regex significa lo stesso che [!abc]nella sintassi glob (cioè ^viene sostituita con !globs). L'uso della [^abc]sintassi dello stile in un glob non è molto portatile perché POSIX non specifica cosa significhi, quindi alcune shell lo interpretano usando una semantica simile a regex mentre altri trattano ^solo come un carattere letterale.
jw013,

1
@ jw013: grazie per i dettagli. Devo ricordare quel glob! =
Regexp

1
Mi è appena venuto in mente che .[!.]potrebbe essere lasciato letteralmente sulla tarriga di comando nel caso comune in cui non ci sono file che corrispondono a quel modello. Alcune shell ti consentono di controllare quel comportamento, ad esempio con bash, shopt -s nullgloblo faranno svanire dalla riga di comando se non corrisponde a nulla, ma non è una funzionalità universale.
zwol,

8

Il .??*carattere jolly ( non un'espressione regolare, sebbene appaia in questo modo) si traduce in nomi di file che iniziano con un punto ( .), seguito da due caratteri singoli ( ??), quindi da qualsiasi numero (zero o più) di altri caratteri ( *).

Forse questa pagina sui caratteri jolly nei nomi dei file sarà utile.


-1

Per aggiungere alle altre risposte, un singolo ?si tradurrà in un singolo nome file e ??corrisponderà a nomi di file che hanno solo due caratteri e così via.

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#

Downvoter, potresti commentare per favore? Sarei felice di essere corretto, se sbaglio.
Sree,

La tua risposta non ha risposto completamente alla domanda.
SabreWolfy,
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.