grep: escludere directory che iniziano col punto

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

grep: escludere directory che iniziano col punto

Messaggioda london3 » venerdì 21 giugno 2019, 8:49

Codice: Seleziona tutto
$ cat ../.dot-dir/nome # questo file dovrebbe essere escluso dalla ricerca perchè è contenuto in una directory con punto iniziale
fabio

$ cat ../nome
fabio

$ grep -r --exclude-dir=".*" fabio ..
# NESSUN RISULTATO (VIENE ESCLUSO TUTTO)


Perchè?

Se invece mi sposto nella directory superiore, tutto funziona come vorrei

Codice: Seleziona tutto
$ cd ..

$ grep -r --exclude-dir=".*" fabio
nome:fabio

$ grep -r fabio
nome:fabio
.dot-dir/nome:fabio


Perchè?
Computer: Lenovo ThinkPad L480
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 250
Iscrizione: gennaio 2014
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.04 x86_64

Re: grep: escludere directory che iniziano col punto

Messaggioda UbuNuovo » venerdì 21 giugno 2019, 11:08

Nelle regex il punto significa "qualsiasi carattere", devi farne l'escape "\." per farlo interpretare come carattere ".".
Quando filtri meglio specificare che il punto deve essere all'inizio "^\.*"

edit:
Quanto detto sopra vale per le regex ma non vale per l'espressione in "--exclude-dir" che richiede il globbing.

Pensavo che ti escludesse tutte le directory interpretando '.*' come regex.
Scusa ma non uso mai quell'opzione di grep ma metto in pipe 'grep -Ev 'REGEX' ...'
Più tardi cerco di fare qualche prova.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3374
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: grep: escludere directory che iniziano col punto

Messaggioda london3 » venerdì 21 giugno 2019, 13:45

UbuNuovo Immagine ha scritto:Nelle regex il punto significa "qualsiasi carattere", devi farne l'escape "\." per farlo interpretare come carattere ".".
Quando filtri meglio specificare che il punto deve essere all'inizio "^\.*"

edit:
Quanto detto sopra vale per le regex ma non vale per l'espressione in "--exclude-dir" che richiede il globbing.

Pensavo che ti escludesse tutte le directory interpretando '.*' come regex.
Scusa ma non uso mai quell'opzione di grep ma metto in pipe 'grep -Ev 'REGEX' ...'
Più tardi cerco di fare qualche prova.


In sintesi comunque non mi spiego perchè i seguenti comandi producano effetti diversi

Codice: Seleziona tutto
$          grep -r --exclude-dir=".*" fabio ..
$ cd .. && grep -r --exclude-dir=".*" fabio
Computer: Lenovo ThinkPad L480
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 250
Iscrizione: gennaio 2014
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.04 x86_64

Re: grep: escludere directory che iniziano col punto

Messaggioda UbuNuovo » venerdì 21 giugno 2019, 16:00

Da quel che ho visto la struttura di prova dovrebbe essere così:
Codice: Seleziona tutto
8-) tree -Fa test
test
├── .dot-dir/
│   └── nome
└── nome

1 directory, 2 files
8-)

mi sposto in .dot-dir
Codice: Seleziona tutto
8-) cd test/.dot-dir/
8-) ls -a
.  ..  nome
8-) cat ../.dot-dir/nome
fabio no
8-) cat ../nome
fabio ok

Dire che il manuale sia chiaro, sarebbe una bugia.
io trovo:
--exclude=GLOB
Skip files whose base name matches GLOB (using wildcard
matching). A file-name glob can use *, ?, and [...] as
wildcards, and \ to quote a wildcard or backslash character
literally.

--exclude-from=FILE
Skip files whose base name matches any of the file-name globs
read from FILE (using wildcard matching as described under
--exclude).

--exclude-dir=DIR
Exclude directories matching the pattern DIR from recursive
searches.
questo pattern DIR è interpretabile come regex o come glob?

A forza di prove ho visto che il modo corretto per ottenere i risultati giusti è indicare l'argomento, con le directory in cui cercare, usando il globbing.
Codice: Seleziona tutto
8-) cd ..
8-) grep -r --exclude-dir=".*" 'fabio' ../test/*
fabio ok
8-) grep -r --exclude-dir=".*" 'fabio' ./*
fabio ok
8-) grep -lr --exclude-dir=".*" 'fabio' ./*
./nome

Confermi?

Probabilmente è meglio usare '--exclude', ma non ho fatto prove.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3374
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: grep: escludere directory che iniziano col punto

Messaggioda london3 » venerdì 21 giugno 2019, 16:26

A questo punto faccio semplicemente
Codice: Seleziona tutto
grep -r --exclude-dir=".*" fabio

che però funziona solo dalla dir corrente[1]

Se mi trovo in una subdir[2] e faccio
Codice: Seleziona tutto
grep -r --exclude-dir=".*" fabio ..

non funge

[1] test
[2] test/.dot-dir (oppure test/QUALCOS'ALTRO)
Ultima modifica di london3 il venerdì 21 giugno 2019, 16:33, modificato 1 volta in totale.
Computer: Lenovo ThinkPad L480
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 250
Iscrizione: gennaio 2014
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.04 x86_64

Re: grep: escludere directory che iniziano col punto

Messaggioda UbuNuovo » venerdì 21 giugno 2019, 16:32

london3 Immagine ha scritto:...
Se mi trovo in una subdir (test/.dot-dir) e faccio
Codice: Seleziona tutto
grep -r --exclude-dir=".*" fabio ..

non funge

No, devi usare l'espansione della shell (che utilizza il globbing):
Codice: Seleziona tutto
grep -r --exclude-dir=".*" fabio ../*
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3374
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: grep: escludere directory che iniziano col punto

Messaggioda london3 » venerdì 21 giugno 2019, 16:38

OK, sperò però di riuscire a ricordare il trucchetto quando mi servirà :)
L'approccio cmq è poco intuitivo.
Computer: Lenovo ThinkPad L480
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 250
Iscrizione: gennaio 2014
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.04 x86_64

Re: grep: escludere directory che iniziano col punto

Messaggioda UbuNuovo » venerdì 21 giugno 2019, 16:49

Io normalmente ricerco con find (semmai con -exec) ed elimino i risultati non voluti con 'grep -v'.

Ho visto che siamo in "Applicazioni", credo sia meglio farsi spostare in "Programmazione", forse qualcuno può chiarire meglio questa situazione.
Segnalo.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3374
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 1 ospite