Avviso: vi è stato un importante aggiornamento della piattaforma forum, si prega di visionare la discussione in merito: viewtopic.php?f=17&t=637551.

grep: escludere directory che iniziano col punto

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi riposta
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 284
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.10 x86_64

grep: escludere directory che iniziano col punto

Messaggio da london3 » venerdì 21 giugno 2019, 9: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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3616
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatto:

Re: grep: escludere directory che iniziano col punto

Messaggio da UbuNuovo » venerdì 21 giugno 2019, 12: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
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 284
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.10 x86_64

Re: grep: escludere directory che iniziano col punto

Messaggio da london3 » venerdì 21 giugno 2019, 14:45

UbuNuovo [url=https://forum.ubuntu-it.org/viewtopic.php?p=5139674#p5139674][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] 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
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3616
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatto:

Re: grep: escludere directory che iniziano col punto

Messaggio da UbuNuovo » venerdì 21 giugno 2019, 17: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
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 284
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.10 x86_64

Re: grep: escludere directory che iniziano col punto

Messaggio da london3 » venerdì 21 giugno 2019, 17: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, 17:33, modificato 1 volta in totale.
Computer: Lenovo ThinkPad L480

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3616
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatto:

Re: grep: escludere directory che iniziano col punto

Messaggio da UbuNuovo » venerdì 21 giugno 2019, 17:32

london3 [url=https://forum.ubuntu-it.org/viewtopic.php?p=5139700#p5139700][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] 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
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 284
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 19.10 x86_64

Re: grep: escludere directory che iniziano col punto

Messaggio da london3 » venerdì 21 giugno 2019, 17:38

OK, sperò però di riuscire a ricordare il trucchetto quando mi servirà :)
L'approccio cmq è poco intuitivo.
Computer: Lenovo ThinkPad L480

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3616
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatto:

Re: grep: escludere directory che iniziano col punto

Messaggio da UbuNuovo » venerdì 21 giugno 2019, 17: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.

Scrivi riposta

Torna a

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti and 8 ospiti