in una miriade di file organizzati in cartelle e sottocartelle devo trovarne uno (non ricordo se .txt o .doc o .xls) che contiene (non sulla stessa riga) 2 stringhe "pippo" e "pluto"

Ho provato con

grep -r "pippo" NOMEDIRECTORY | grep "pluto"

ma trova solo i file che contengono le due stringhe sulla stessa riga.

chiesto 24 Dic '15, 20:33

carlocorio's gravatar image

carlocorio
198113039

modificato 25 Dic '15, 02:08

dadexix86's gravatar image

dadexix86 ♦♦
16.9k716161


Per avere l'elenco dei nomi di file in cui sono contenute almeno una delle due stringhe "pippo" OR "pluto", puoi usare l'opzione -e:

grep -lr -e "pippo" -e "pluto" NOMEDIRECTORY

Diverso è il caso se vuoi un AND anche su righe diverse, che si puo fare con due grep, il secondo dentro un ciclo:

grep -ril "pippo" NOMEDIRECTORY |
    while read f; do
        grep -il "pluto" "$f"
    done

che nel caso in cui i nomi dei file non contengano spazi si può semplificare così:

grep -il "pluto" $(grep -ril "pippo" NOMEDIRECTORY)

Un altro metodo è con find e awk:

find NOMEDIRECTORY -type f -exec awk '/pippo/ { ok1 = 1 }; /pluto/ { ok2 = 1 }; END { if (ok1 && ok2) print FILENAME }' {} +

Edit

Per cercare in documenti e fogli elettronici MS Office, conviene prima trasformarli in testo.
Per questo scopo c'è il pacchetto di conversione unoconv (da installare). Volendo cercare anche nei PDF, conviene convertirli prima in testo. Ecco una possibile soluzione, uno script che prende come primo e secondo parametro due stringhe e terzo parametro un nome di directory, per esempio:

nomescript "pippo" "pluto" NOMEDIRECTORY

ecco lo script:

#!/usr/bin/env bash

to_text() {
    if [[ "$1" = *.doc || "$1" = *.docx ]]; then
        unoconv --stdout --format text "$1"
    elif [[ "$1" = *.xls || "$1" = *.xlsx ]]; then
        unoconv --stdout --format csv "$1"
    elif [[ "$1" = *.pdf ]]; then
        pdftotext "$f" -
    else
        cat "$1"
    fi
}

find "$3" -type f |
    while read f; do
        if grep -qi "$1" <(to_text "$f") && grep -qi "$2" <(to_text "$f"); then
            echo "$f"
        fi
    done
coll. permanente

ha risposto 24 Dic '15, 22:29

enzotib's gravatar image

enzotib ♦♦
14.0k112186

modificato 26 Dic '15, 09:23

ok grazie,

ci lascio anche -r e ci aggiungo -i per renderlo case-insensitive.... poi ti aggiorno sui risultati

(25 Dic '15, 00:19) carlocorio carlocorio's gravatar image

accidenti, mi sono accorto adesso che non fa quello che volevo io: a me serviva una operazione logica AND, invece mi sembra faccia un "OR": mi trova anche i file dove c'è anche solo una delle due voci

(25 Dic '15, 00:28) carlocorio carlocorio's gravatar image

@carlocorio: ho modificato la risposta per rispondere al caso dell AND, che non era chiaro nella domanda iniziale.

(25 Dic '15, 11:16) enzotib ♦♦ enzotib's gravatar image

grep funziona, ma becca i txt e gli xls, non becca i doc :(

invece il find non sono riuscito a farlo funzionare (non trova nulla)

(25 Dic '15, 19:21) carlocorio carlocorio's gravatar image

rettifico: con i doc un po' funziona e un po' no.... comunque sono riuscito a recuperare il file (proprio un doc)... GRANDE! (non è stato necessario eseguire la conversione che mi hai gentilmente indicato, ma che in futuro potrebbe essere utile...)

(26 Dic '15, 09:26) carlocorio carlocorio's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×8

domanda posta: 24 Dic '15, 20:33

domanda visualizzata: 443 volte

ultimo aggiornamento: 26 Dic '15, 09:27

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.