richiamare una ricerca nei file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
boylin
Prode Principiante
Messaggi: 206
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 21.10
Sesso: Maschile

richiamare una ricerca nei file

Messaggio da boylin »

Ciao, cerco di spiegarla semplice,
ho una parola che devo cercare sempre nella stessa directory ed apro Catfish oppure Geany e seleziono "Cerca in Directory"

Il comando per cercare è:

Codice: Seleziona tutto

grep -nHIiE parola /home/utente/archivio/*
Per evitare di aprire catfish/geany ogni volta, andare nel menù e incollare la parola quale potrebbe essere un modo più veloce di fare la ricerca? tipo uno shortcut o un lanciatore o qualcosa del genere a cui cambio solo il termine e poi lo lancio, non saprei...
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2505
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 18.04 Bionic Beaver
Sesso: Maschile
Località: Roma, Italia

Re: richiamare una ricerca nei file

Messaggio da DoctorStrange »

Ma quindi questa ricerca deve essere parametrizzata? La parola che devi cercare, cambia di volta in volta? Altrimenti, cercare sempre la stessa parola, è roba facile, mentre creare un lanciatore che cerchi parole diverse, è un po piu difficile. In che modo cambia questa parola? Quale parola è, di preciso? Devi sapere se esista una specifica directory, o file? In questo caso potresti usare anche find.
Avatar utente
boylin
Prode Principiante
Messaggi: 206
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 21.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

la "parola" che devo cercare cambia di volta in volta, al 99% però è sempre un numero: es. 254621251.
La directory in cui cercare è sempre la stessa e in realtà contiene più file di testo: è proprio in questi file di testo che devo cercare il termine.
Avatar utente
GjMan78
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2077
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: Gnome / Mate
Distribuzione: Manjaro / Parrot Security OS
Sesso: Maschile
Località: ~/Italia/Lazio/Viterbo/

Re: richiamare una ricerca nei file

Messaggio da GjMan78 »

LA soluzione in realtà è semplice.

apri con un editor di testo il file

Codice: Seleziona tutto

~/.bashrc
Scorri il file fino alla sezione degli alias ed incolla questo

Codice: Seleziona tutto

cerca() {
        grep -nHIiE "$1" /home/utente/archivio/*
}
Salva ed esci.

Chiudi e riapri il terminale per aggiornare la configurazione.

Ora hai a disposizione la funzione

Codice: Seleziona tutto

cerca parola
che richiamerà ogni volta il comando che hai postato cercando "parola" nei tuoi file di testo in archivio.
HP Pavilion 15 - AMD A6-5200 - 8 Gbyte Ram DDR3 - SSD Samsung 500 Gbyte
Trashware 4 Fun : Asus EEEpc - Atom 1.6Ghz - 2 Gbyte Ram DDR2 - HDD 160 Gbyte - Manjaro minimal Xfce
Nel dubbio, cripta!
Avatar utente
boylin
Prode Principiante
Messaggi: 206
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 21.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

giusto, un alias... e dire che ne ho creati anche altri in passato, grazie mille!
Lucio C
Prode Principiante
Messaggi: 190
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Milano

Re: richiamare una ricerca nei file

Messaggio da Lucio C »

Non si possono fare alias al volo con bash ? Con (t)csh si' e spesso mi capita di farne di short-lived, cioe' solo per una particolare sessione
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2516
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 20.04
Località: Palermo

Re: richiamare una ricerca nei file

Messaggio da rai »

giusto, un alias...
che per la precisione è una funzione, e infatti può accettare parametri

Forse per il caso specifico è eccessivo, comunque non credo di essere OT se posto comunque lo script che io uso per cercare una stringa dentro file di testo.
Funziona con file di testo semplice, pdf, open documents, documenti di MS Office.
Richiede due argomenti:
· la directory a partire da cui fare la ricerca ( per quella corrente basta il . )
· la stringa da cercare
La ricerca predefinita è ricorsiva in tutte le sottocartelle ma c'è l'opzione di fermarsi alla prima cartella

Codice: Seleziona tutto

#!/bin/bash

[[ $# -lt 2 || ! -d $1 ]]  && echo -e "List all text documents in the DIR path containing the string STR

USAGE:\t\t$(basename "$0") DIR STR [1]

\tDIR existing path where to start the search
\tSTR \"quoted string\" [Case insensitive]
\t1   option for NON-recursive search. Default: search all sub-directories
" && exit 2

[[ $3 = 1 ]] && depth="-maxdepth 1"
files=$(find "$1" $depth -type f 2>/dev/null)
while read f ; do
    fileType=$(file -bL "$f" | grep -Eo "PDF|OpenDocument|UTF-8|ASCII|Microsoft|Windows")
    case $fileType in
        PDF) 
        if [ -x "$(which pdftotext)" ]; then 
            pdftotext "$f" -  2>/dev/null | grep -iq "$2" &&  echo -e "$f\t\t$fileType"
		else 
		    echo -e "pdftotext is not available.\nTry sudo apt-get install poppler-utils"
		    exit 1
		fi
		;;
        
        OpenDocument) 
        if unzip -p "$f" content.xml | grep -iq "$2"; then
            echo -e "$f\t\t$fileType" 
        fi
        ;;
            
        UTF-8|ASCII) 
        grep -iq "$2" "$f" &&  echo -e "$f\t\t$fileType"
        ;;
        
        Microsoft|Windows)
        if [ -x "$(which unoconv)" ]; then
            if [[ ${f#*.} =~ doc.?$ ]]; then
                if unoconv -f txt --stdout "$f" | grep -iq "$2"; then
                    echo -e "$f\t\t$fileType"
                fi
        #   else
        #       echo "[Info] skipping $f" # unoconv fails on non-Office MS files
            fi
        else
            echo -e "unoconv is not available.\nTry sudo apt-get install unoconv"
            exit 1
		fi
        ;;
        
        *)
        ;;
    esac    
done <<<"$files"

per cercare nei file non plain text dipende da unoconv e da poppler-utils
:ciao:
Ultima modifica di rai il sabato 1 ottobre 2022, 16:28, modificato 1 volta in totale.
Avatar utente
GjMan78
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2077
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: Gnome / Mate
Distribuzione: Manjaro / Parrot Security OS
Sesso: Maschile
Località: ~/Italia/Lazio/Viterbo/

Re: richiamare una ricerca nei file

Messaggio da GjMan78 »

Molto interessante.

Grazie
HP Pavilion 15 - AMD A6-5200 - 8 Gbyte Ram DDR3 - SSD Samsung 500 Gbyte
Trashware 4 Fun : Asus EEEpc - Atom 1.6Ghz - 2 Gbyte Ram DDR2 - HDD 160 Gbyte - Manjaro minimal Xfce
Nel dubbio, cripta!
Avatar utente
OMBRA_Linux
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2289
Iscrizione: mercoledì 18 febbraio 2015, 14:24
Desktop: Android Linux Windows
Distribuzione: Android / Linux / Windows10-11
Sesso: Maschile
Località: Napoli

Re: richiamare una ricerca nei file

Messaggio da OMBRA_Linux »

E' molto semplice.
Supponiamo che nella cartella ( Documenti ) hai un file di testo chiamato ''Prova'' al quale al suo interno vuoi cercare la parola ( Napoleone ) basta aprire il Terminale all'interno della cartella Documenti e digitare il comando;

Codice: Seleziona tutto

grep -R Napoleone 
che a sua volta ti mostrerà l'intero testo del file con la parola '' Napoleone '' evidenziata.
Se per vivere devi strisciare, alzati e muori.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2516
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 20.04
Località: Palermo

Re: richiamare una ricerca nei file

Messaggio da rai »

OMBRA_Linux ha scritto:
giovedì 29 settembre 2022, 19:32
E' molto semplice.
Supponiamo che nella cartella ( Documenti ) hai un file di testo chiamato ''Prova'' al quale al suo interno vuoi cercare la parola ( Napoleone ) basta aprire il Terminale all'interno della cartella Documenti e digitare il comando;

Codice: Seleziona tutto

grep -R Napoleone 
che a sua volta ti mostrerà l'intero testo del file con la parola '' Napoleone '' evidenziata.
Beh, messa così è semplice ma forse migliorabile. Probabilmente l'OP (e la maggior parte di chi cerca il/i file contenenti una certa stringa) troverebbe più utile avere elencati i file che contengono la stringa cercata, piuttosto che avere stampato tutto il contenuto. Quindi meglio usare grep -l path/* se ti basta il nome dei file interessati; oppure grep -nCx path/* per avere stampate le x righe precedenti e le x seguenti quella contenente la stringa (ogni riga preceduta nell'output dal nome del file e dal numero di riga nel file)

Comunque, non ero venuto a scrivere qui per questo ma perché mi è stato giustamente fatto notare da @UbuNuovo che lo script che ho condiviso presenta una potenziale criticità nel caso l'utente voglia effettuare la ricerca in path contente spazi. Basta/bisogna proteggere la variabile $1 tra doppi apici "$1". Vado a correggere il post in questione
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti