[Risolto] richiamare una ricerca nei file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.10
Sesso: Maschile

[Risolto] 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...
Ultima modifica di boylin il lunedì 24 aprile 2023, 19:26, modificato 1 volta in totale.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2855
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
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
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.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
Rampante Reduce
Rampante Reduce
Messaggi: 5404
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: KdePlasma
Distribuzione: EndeavourOS
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.
MacBook Pro - Intel i5-3210 - 16 Gbyte Ram DDR3 - SSD 500 Gbyte x 2
»»» 𝗙𝗮𝗶 𝗶𝗹 𝗕𝗮𝗰𝗸𝘂𝗽! ¯\_(ツ)_/¯
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.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
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

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: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.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
Rampante Reduce
Rampante Reduce
Messaggi: 5404
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: KdePlasma
Distribuzione: EndeavourOS
Sesso: Maschile
Località: ~/Italia/Lazio/Viterbo/

Re: richiamare una ricerca nei file

Messaggio da GjMan78 »

Molto interessante.

Grazie
MacBook Pro - Intel i5-3210 - 16 Gbyte Ram DDR3 - SSD 500 Gbyte x 2
»»» 𝗙𝗮𝗶 𝗶𝗹 𝗕𝗮𝗰𝗸𝘂𝗽! ¯\_(ツ)_/¯
Avatar utente
OMBRA_Linux
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2696
Iscrizione: mercoledì 18 febbraio 2015, 14:24
Desktop: HP / Lenovo / Samsung
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: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.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
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

vorrei apportare una modifica a questa funzione:

Codice: Seleziona tutto

cerca() {
        grep -nHIiE "$1" /home/utente/archivio/*
}
gli dovrei passare un parametro, in base al quale grep lavora su una directory piuttosto che un'altra:

cerca -e parola (la cerca in /home/utente/articoli)
cerca -i parola (la cerca in /home/utente/archivi)
Avatar utente
GjMan78
Rampante Reduce
Rampante Reduce
Messaggi: 5404
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: KdePlasma
Distribuzione: EndeavourOS
Sesso: Maschile
Località: ~/Italia/Lazio/Viterbo/

Re: richiamare una ricerca nei file

Messaggio da GjMan78 »

Potresti modificarla cosi

Codice: Seleziona tutto

cerca() {                                         
        grep -nHIiE "$1" "$2"/*
}
In questo modo puoi richiamare la funzione usando due parametri: la parola da ricercare ed il percorso in cui cercarla.

Esempio

Codice: Seleziona tutto

 cerca parola /home/utente/articoli
MacBook Pro - Intel i5-3210 - 16 Gbyte Ram DDR3 - SSD 500 Gbyte x 2
»»» 𝗙𝗮𝗶 𝗶𝗹 𝗕𝗮𝗰𝗸𝘂𝗽! ¯\_(ツ)_/¯
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

ho fatto in questo modo:

Codice: Seleziona tutto

cerca() {
        if [[ $1 == 'f' ]]; then
                grep -nHIiE "$2" /home/io/Documenti/fatture/*
        elif [[ $1 == 'c' ]]; then
                grep -nHIiE "$2" /home/io/Documenti/contratti/*
        fi
}
ma se richiamo da terminale:

Codice: Seleziona tutto

cerca f 1234567
ottengo "bash: cerca: comando non trovato"

Se invece digito direttamente la stringa: grep -nHIiE .... funziona e trova il documento
Avatar utente
GjMan78
Rampante Reduce
Rampante Reduce
Messaggi: 5404
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: KdePlasma
Distribuzione: EndeavourOS
Sesso: Maschile
Località: ~/Italia/Lazio/Viterbo/

Re: richiamare una ricerca nei file

Messaggio da GjMan78 »

Hai inserito la stringa nel file .bashrc come alias?

Hai chiuso e riaperto il terminale dopo?
MacBook Pro - Intel i5-3210 - 16 Gbyte Ram DDR3 - SSD 500 Gbyte x 2
»»» 𝗙𝗮𝗶 𝗶𝗹 𝗕𝗮𝗰𝗸𝘂𝗽! ¯\_(ツ)_/¯
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

sì, così come l'ho postata, tra l'altro lo stesso codice su un'altra distro funzionava!.
Poi ho dato: source ~/.bashrc
In queste ore ho anche riavviato il PC per altri motivi
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

è assurda sta cosa, in una distro precedente funzionava... stesso codice.
A voi funziona?
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: richiamare una ricerca nei file

Messaggio da rai »

Dovrebbe funzionare, a meno di avere nel .bashrc qualche riga precedente fuori posto che manda il parser della shell nel pallone:
prova a toglierla da .bashrc e metti la stessa funzione in coda al file ~/.bash_aliases (se il file non c'è già lo crei, che tra l'altro sarebbe il posto giusto per tenere alias e funzioni). Chiudi il terminale e riaprilo per riprovare
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

questo è il contenuto dell'attuale .bashrc

Codice: Seleziona tutto

# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "$(dircolors)"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'

qui ci va la funzione postata prima
proverò a fare come hai scritto
Avatar utente
GjMan78
Rampante Reduce
Rampante Reduce
Messaggi: 5404
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: KdePlasma
Distribuzione: EndeavourOS
Sesso: Maschile
Località: ~/Italia/Lazio/Viterbo/

Re: richiamare una ricerca nei file

Messaggio da GjMan78 »

Mettendola in fondo al file .bashrc funziona, almeno a me.
MacBook Pro - Intel i5-3210 - 16 Gbyte Ram DDR3 - SSD 500 Gbyte x 2
»»» 𝗙𝗮𝗶 𝗶𝗹 𝗕𝗮𝗰𝗸𝘂𝗽! ¯\_(ツ)_/¯
Avatar utente
boylin
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 257
Iscrizione: domenica 6 novembre 2016, 18:24
Desktop: xfce
Distribuzione: Xubuntu 23.10
Sesso: Maschile

Re: richiamare una ricerca nei file

Messaggio da boylin »

mettendola in un file diverso sta funzionando, .bash_aliases

Grazie!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti