[Risolto]bash: cercare OpenDocuments in base al contenuto

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

[Risolto]bash: cercare OpenDocuments in base al contenuto

Messaggio da rai »

Ciao a tutti

Vorrei elencare tutti gli Open Document in un dato path che contengono una data stringa. Questa è la situazione:

Codice: Seleziona tutto

$ ls test/*.od*
test/drop.odt  test/eyedrops.odt  test/glaucoma.odt  test/Senzanome1.ods
$ for f in test/*.od* ; do unzip -p $f content.xml | grep -q glaucoma && echo $f; done
test/glaucoma.odt
test/Senzanome1.ods
in questo modo trovo i due documenti in test/ che hanno la stringa "glaucoma" ma non cerco nelle subdir

ho provato

Codice: Seleziona tutto

cd test
for f in $(ls -R | grep -Ei ".*\.OD."); do
  unzip -p "$f" content.xml | grep -q $String && echo "$f"
done
ma, a parte il solito problema coi caratteri speciali :devilmad: nel nomefile, questo non funziona in tutti i casi in cui il documento trovato è in una subdir, dato che da ls -R ottengo solo il basename

e così sono tornato a find (da cui ero partito) ma non ne vengo a capo:

Codice: Seleziona tutto

$ find -L test -iname *.od* -exec unzip -p '{}' content.xml \;| grep -c glaucoma
2
questo mi trova correttamente i due documenti che hanno la stringa cercata: quello che non riesco a fare è stampare ad ogni greppata riuscita il nomefile elaborato da find
Se per questo scopo esiste un tool da CLI già pronto sono lieto di apprenderlo, però in questo caso, re-inventare la ruota sarebbe istruttivo ( per me ;) )
Ultima modifica di rai il domenica 6 luglio 2014, 9:27, modificato 1 volta in totale.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da vaeVictis »

Non ho capito bene il problema, mi sa, ma forse: hai provato a fare un ciclo while dopo la pipe?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da rai »

vaeVictis [url=http://forum.ubuntu-it.org/viewtopic.php?p=4611307#p4611307][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Non ho capito bene il problema, mi sa, ma forse: hai provato a fare un ciclo while dopo la pipe?
il problema [secondo me] è che da ogni giro di find ho bisogno di estrarre sia il nome dell'OD* sia il testo del suo content.xml per poterlo passare a grep
Ho anche provato con un secondo -exec ad assegnare il file a una variabile ma sembra una brutta idea:

Codice: Seleziona tutto

$ find -L test -wholename *.od* -exec f='{}' \; -exec unzip -p '{}' content.xml \;| grep -q glaucoma && echo $f
find: "f=test/Senzanome1.ods": File o directory non esistente
find: "f=test/drop.odt": File o directory non esistente
find: "f=test/eyedrops.odt": File o directory non esistente
find: "f=test/glaucoma.odt": File o directory non esistente
alla luce di questo, sono io che non ho capito come mi aiuta un ciclo se sono già dall'altro lato della pipe e non possiedo il nomefile?
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da vaeVictis »

Non conosco molto bene il formato odt.
Aspettiamo che passino altri utenti più esperti.
Se non dovessero passare, ti dico quanto ho fatto qui sul portatile (con stranezze annesse) e da cosa credo dipenda il tuo problema.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da rai »

Grazie vaeVictis
gli odt non son altro che archivi compressi contenenti diversi file: il testo (insieme ad altre cose) sta tutto nel file content.xml
per questo usando opportunamente unzip è possibile passare content.xml a un parser xml o (come basta qui) passarlo a grep
Quindi, benvenuti gli esperti di odt ma credo che il mio problema richieda un esperto di find ;)
aspetto le tue stranezze :)
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da UbuNuovo »

Codice: Seleziona tutto

#!/bin/bash
touch tmp
file=$(ls *.od*) 
while read f; do 
	unzip "$f" -d"tmp/$f/" &>/dev/null
done < <(echo "$file")
grep -rio 'glaucoma' tmp/*/*
rm -fr tmp/*
Non chiedetemi altro, è tornato un mio fratello, abbiamo festeggiato e sono brillo! :p

ps: Occhio alla pressione dell'occhio! Sono anche ottico contattologo!

oops: per quello che ti serve meglio questo grep:

Codice: Seleziona tutto

grep -riwo 'glaucoma' tmp/*/content.xml | awk -F'/' '{print $2}'
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da UbuNuovo »

:shy: Scusate non avevo letto bene! Ti serve anche per le sottodirectory.
Questo a me funziona:

Codice: Seleziona tutto

#!/bin/bash
file=$(find . -iname "*.od*")
while read f ; do
    if(unzip -p "$f" | grep -iwq "glaucoma"); then
        echo "$f"
    fi
done < <(echo "$file")

Codice: Seleziona tutto

8-) ./script2.sh
./glaucoma.odt
./sottodir/glaucoma2.odt
Ho messo la "i" perché in un file ho "glaucoma", nell'altro "GLAUCOMA".

ps: '-p' di unzip non la conoscevo
Salva l'Ucraina! 🇺🇦
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da rai »

Ciao UbuNuovo, grazie, questo risolve il problema

Codice: Seleziona tutto

#!/bin/bash

[[ $# -lt 2 || ! -d $1 ]]  && echo -e "USAGE:\t\t$(basename "$0") DIR STR [1]
List all Open Documents containing STR in the path DIR
if option \`1' is specified will search DIR only. Default: all sub-directories

\tDIR     existing path where to start the search
\tSTR     \"quoted string\"
\t1       option for NON-recursive search
" && exit 2

[[ $3 = 1 ]] && depth="-maxdepth 1"
file=$(find $1 $depth -iname "*.od*")
while read f ; do
    unzip -p "$f" content.xml | grep -iq "$2" &&  echo "$f"
done <<< "$file"
come vedi, a parte i parametri per renderlo usabile, c'è una sola vera differenza rispetto al tuo codice: faccio espandere solo content.xml: questo sia perché unzippare e greppare il resto del contenuto dell'OD* è inutile, sia perché potrebbero venirne fuori caratteri strani (il documento può contenere immagini) e magari grep si offende
:ciao:
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: bash: cercare OpenDocuments in base al contenuto

Messaggio da UbuNuovo »

Si, è meglio come hai fatto tu; non conoscendo la forma "unzip -p "$f" content.xml" non l'ho usata. :ciao:
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: nik1404 e 17 ospiti