Newsgroup: it.comp.os.linux.iniziare
Titolo: Comando per ricerca file [anche] in archivi 7z

Mi servirebbe riuscire a fare un comando shell (da usare con bash e zsh)
per ricercare dei file in base ad un pattern del nome, dentro una
directory che potrebbe contenere un numero indefinito di sottodirectory,
file di ogni tipo e file archivio (per lo più zip e 7z). Almeno per i
file zip e 7z, la ricerca dovrebbe entrare nell'archivio.
Il comando dovrebbe essere qualcosa del tipo:
 
arcsearch percorsodipartenza "pettern"
 
esempio: arcsearch ./ "*.odt" dovrebbe trovare tutti i file con
estensione ".odt" nel percorso attuale
 
oppure: arcsearch ~/Download "*pippo*" dovrebbe trovare nella cartella
dei download tutti i file con la stringa "pippo" nel nome
 
Per ricercare i file negli archivi 7z, zip si potrebbe usare:
7za l nomefilearchivio "testoricercato" -r
 
L'output dovrebbe dirmi il percorso del file archivio dove viene
riscontrato il pattern, e l'elenco dei file che contengono il pattern.
L'ottimale è che mi vengano restituiti anche i nomi di eventuali
directory/file non in archivi che contengono lo stesso pattern nel nome.
 
Esempo: arcsearch ~/Download "*foo*" 
 
~/Download/foofile.qgs
~/Download/foofolder
~/Download/folder/archivio.7z
   Date      Time    Attr         Size   Compressed  Name
-------------------------------------------------------------------------
2020-05-22 20:35:22 ....A     100914    46710    File info foo.png
2020-05-22 20:34:07 ....A       67134                  foo settings.png
-------------------------------------------------------------------------
2020-05-22 20:45:23            167048     46710   2 files
 
Insomma, per quest'ultima parte mi sta bene l'output del comando 7za, se
poi si riesce ad evitare l'intestazione, meglio. Per gli altri file e
cartelle, oltre al percorso non sarebbe male avere anche la data di
modifica e la dimensione (ma non è indispensabile).
Ah, invece bisognerebbe evitare di ripetere il nome delle directory che
riscontrano il pattern per ogni file e/o cartella contenuta.
 
-- 
Per rispondere, togliere -NOSPAM- dall'indirizzo.

 riscontrano il pattern per ogni file e/o cartella contenuta.
 
-- 
Yoda
 

 a ravanare ogni volta, perche' legge il suo db che si crea).
 
Mi rendo conto dalla tua risposta che non ho formulato bene la
richiesta:
 
arcsearch ./ "*.odt"
 
dovrebbe trovare tutti i file con estensione ".odt" nel percorso
attuale, nelle sottocartelle e dentro i file archivio ivi contenuti (.7z
e .zip sopratutto, ma se entra anche in altri archivi meglio... per fare
le cose per fino, si potrebbe anche pensare a dei flag per includere e/o
escludere alcuni tipi di formati archivio).
 
Comunque, la base della richiesta è cercare file in base al nome dentro
una serie di archivi .7z, senza dover dare a mano il comando:
 
7za l nomefilearchivio "testoricercato" -r
 
per ogni singolo archivio.
 
P.S. arcsearch è il nome che ho dato all'ipotetico comando o alias che
esegua quanto richiesto.
 
P.P.S. la mia distro è... macOS. Non è linux, ma è pur sempre unix-like.
Purtroppo i software che uso abitualmente non girano su linux. O
Windows, o Mac. Però so che su linux è più facile trovare persone
competenti con bash o altre shell, pertanto ho postato qui (ed è
qualcosa che in linea di massima dovrebbe funzionare anche su linux).


 qualcosa che in linea di massima dovrebbe funzionare anche su linux).
 
Allora e' semplicissimo, ecco alcune le righe di comando:
grep testo *  (cerca in tutti i file della directory attiva)
grep testo /var/pippo/*  (tutti i file della directory pippo)
grep -R testo /home  (tutti i file di ogni subdir di /home, ad
esempio dato da root "grep -R testo /" cerca in tutto il fs)
 
Inoltre, per tutte, puoi cercare piu' nomi. Ecco come:
grep -e testo1 -e testo2 -e "testo3 con spazio" *
grep -e testo1 -e testo2 -e "testo3 con spazio" /var/pippo
grep -R -e testo1 -e testo2 -e "testo3 con spazio" /home
 
Puoi averlo anche in tecnicolor con "--color", ma se leggi la
manpagina (in rete, se per il mac non c'e') vedi moltissime
opzioni per la ricerca e per l'output ciao
 
(esempio "-d skip" non va nelle subdir, -h non mette il nome del
file, -o mette solo il pattern che cerchi, -i senza case sensitive,
-w la parola esatta.. sto andando a memoria)
 
Con zgrep e' tutto lo stesso, ma legge nei file compressi ariciao e
fammi sapere come va col mac
 
-- 
Yoda
 

 grep testo *  (cerca in tutti i file della directory attiva)
 
Dimenticavo: "grep testo *.html" o cose simili, per cercare solo
dentro i file con quell'estensione.
 
-- 
bye, Yoda
 

 esempio dato da root "grep -R testo /" cerca in tutto il fs)
OK. Ma il problema principale è cercare i file dentro archivi in formato
.7z
Il fatto è che da anni comprimo e archivio i lavori finiti in file .7z.
Tra l'altro l'archivio è distribuito in modo non omogeneo, nel senso che
per i clienti che ho fatto un solo lavoro mi trovo un unico file .7z che
ho nominato con un numero di archivio ed il nome del cliente. Per i
clienti che hanno più lavori, ho una cartella con il nome del cliente e
dentro più file .7z, ognuno nominato con un numero di archivio e una
breve descrizione del lavoro.
Ieri mi serviva un documento di cui posso immaginare parte del nome, ma
non ricordo in che pratica l'ho fatto. Per il momento ho risolto in
altro modo, ma mi è restata la sensazione che un comando che permetta di
ricercare i file dentro gli archivi .7z (senza aprirli uno ad uno)
potrebbe tornarmi utile anche in futuro. Poi se lo stesso comando mi
entra anche in altri tipi di archivio (.zip, .tar, .tgz, ecc...) ed
elenca anche file e cartelle che contengono il pattern ricercato...
potrebbe essere ancora più utile, ma la base del problema è ricercare
ricorsivametne il pattern nei nomi dei file contenuti in archivi .7z


 breve descrizione del lavoro.
 
Allora se hai clienti e ci lavori non sei un novellino, ti conviene
cercare la manpagina in rete di grep e di zgrep.
Ti aggiungo che dovrebbero fare esattamnte quello che cerchi e che
ti serve, zgrep praticamente ha la stessa sintassi di grep.
Tieni presente questa riga:
grep -R -e pattern1 -e pattern2 /home/*/*/*.zip /var/pippo/*clienti*
 
che vale anche per zgrep ciao
 
-- 
Yoda
 

 cercare la manpagina in rete di grep e di zgrep.
 
Lavoro, ma non in campo informatico. Diciamo che lì mi ci arrangio,
anche perché è un interesse che porto avanti da quando ho lasciato
l'università (ex. facoltà di scienze dell'informazione).
 
P.S. Sicuro che zgrep entri negli archivi .7z?
-- 
Per contattarmi, togliere -NOSPAM- dall'indirizzo.
To contact me, remove -NOSPAM- from address.

 .7z
 
Io ti lancio una possibile soluzione
avventurosa...
 
Esiste (esistono?) dei moduli fuse
che montano i file 7z in qualche
mount point.
 
Una volta montati, si possono usare
i vari tool come "find".
 
Quindi uno potrebbe cercare prima
tutti i file 7z, montarli in qualche
posto "temporaneo" e poi fare un
"find" dappertutto...
 
bye,
 
-- 
 
piergiorgio

 P.S. Sicuro che zgrep entri negli archivi .7z?
 
Questo non lo so, non uso 7z, prova, che tanto zgrep non puo' farti
assolutamente nessun danno ciao
 
-- 
Yoda
 

 assolutamente nessun danno ciao
 
A me risulta che non "entri" nei file 7z
 
L'unico comando che conosco in grado di reicercare dei file in archivi
file.7z è per l'appunto 7z (o 7za)
 
7za l "nomefilearchivio" "testoricercato" -r
 
funziona per ricercare il "testoricercato" nel file nomefilearchivio
 
Dovrei trovare come usarlo ricorsivamente sugli archivi presenti in una
directory e relative sottodirectory. E se nella ricerca degi archivi
venisse riscontrato il "testoricercato" in file o cartelle non parte di
archivi 7z, mi starebbe bene che venissero comunque segnalati.


 arcsearch percorsodipartenza "pettern"
 
Installa MetaTracker e poi usalo da linea di comando. Ti passo dei riferimenti
per Ubuntu, dovrebbero valere ancora e dovrebbero essere abbastanza neutrali
rispetto alla distribuzione (al massimo cambia il nome del pacchetto):
 
https://help.ubuntu.com/community/MetaTracker
 
 
Enrico

 
https://help.ubuntu.com/community/MetaTracker
 
Sicuro che "entri" negli archvi .7z? Non ho visto niente in merito.


Addi' 15 apr 2021 04:59:05, Aladino scrive:

Dunque dunque.. vediamo se puo' servirti questo:
A) Dovresti vedere tu (io divrei installarlo eccetera) se il comando
7za prende i caratteri jolly. Cioe' cosa fa se gli dai:
7za l ./* "testoricercato" -r
siccome prevede il "-r", penso di si' e in questo caso sei a posto.
N.B. prova anche con:
7za l * "testoricercato" -r
7za l pippo/* "testoricercato" -r
7za l /home/pippo/* "testoricercato" -r
(sei sicuro che il "-r" non lo voglia in prima posizione, come tutte
le opzioni UNIX, cioe' prima del comando "l"?)
 
B) Se non va l'A, allora dillo che ti do il ciclo for per creare
l'elenco dei nomi-file da dare in pasto a 7za (si fa con find) ciao
 
-- 
Yoda
 

 l'elenco dei nomi-file da dare in pasto a 7za (si fa con find) ciao
Grazie, è quello che in qualche modo sto cercando di fare: avere un
elenco di file e cartelle, e riuscire a passarle al comando 7za, visto
che per il nome dell'archivio non sono ammessi caratteri jolly. Inoltre
se a 7za (con la funzione list) vengono passati file non di archivi
supportati, restituisce (ovviamente) un errore. Pertanto bisognerebbe
riuscire a passargli solo i file con estensioni .7z e .zip (a me bastano
questi, ma volendo ce ne sono parecchi altri; per un elenco completo si
veda 
https://www.7-zip.org
).
Diciamo che poi sarebbe utile che il comando batch controlli la presenza
del "testocercato" anche nel nome dei file elencati (non solo dentro i
file archivio).


 per il nome dell'archivio non sono ammessi caratteri jolly.
A dire il vero non č proprio cosě. Usando un carattere jolly, il comando
prende il primo file che corrisponde ed esegue il comando: se trova un
file che non č un archivio supportato esce con errore, se trova un
archivio supportato fa l'lelenco dei file che contengono il
testoricercato, ma comunque esce dopo aver elaborato la richiesta sul
primo archivio. Diciamo che nel comando bash bisognerebbe evitare di
passare al comando 7z file non supportati, perché si rischia di avere
una serie infinita di messaggi di errore tra cui si rischia di non
vedere eventuali risposte positive. Pertanto o si inserisce nel comando
gli archvi in cui ricercare il testo, o si passano con un flag.
 
arcsearch -at ".7z .zip .tar .gzip .rar" <percorsodipartenza>
<testoricercato>
 
oppure
 
arcsearch <percorsodipartenza> <testoricercato> .7z .zip .rar .gzip .rar
 
Il mio interesse lavorativo sarebbe solo per la ricerca in archivi .7z,
tutto il resto č... didattica.


 tutto il resto è... didattica.
 
Bon.. oggi ho un po' di tempo, ecco una soluzione; con Linux va
perfettamente, per il Mac non so se c'e'.
Ecco l'output della ricerca, fatta con questa riga di comando:
 
[/tmp]yoda_$: for j in *.7z; do patool search Ballantine $j; done
 
-cite-
./ala/MyMovie/Peck:è il dottor Edwards, ma un misterioso John Ballantine
 che ha perso la
patool: Searching 'Ballantine' in ala.7z ...
patool: running /usr/bin/grep -r -e Ballantine .
patool:     with cwd='/tmp/Unpack_6ipqhggx'
 
./ala/MyMovie/Peck:è il dottor Edwards, ma un misterioso John Ballantine
 che ha perso la
patool: Searching 'Ballantine' in prova.7z ...
patool: running /usr/bin/grep -r -e Ballantine .
patool:     with cwd='/tmp/Unpack_bh05lujt'
-/cite-
 
Allora, descrizione.
- in /tmp ho creato due archivi: ala.7z e prova.7z
- ala.7z comprende TUTTO cio' che ho in /tmp, perche' non ero
pratico della riga di comando da dare a 7za
- prova.7z e' perfetto, contiene la sola directory /tmp/ala, nella
quale ci sono due subdir: MyMovie e Wmovie, con dentro file di testo
in entrambe (recensioni su film).
- zgrep grep 7za NON possono trovare testo archiviato con 7z
- solo 7za puo' leggere l'elenco di cio' che c'e' nell'archivio, ma
NON puo' cercare testo in ogni file contenuto in tale archivio
- appurato questo, ho trovato l'utility patool, da me e' un
pacchetto debian che ho installato al volo in 2 minuti
- esso (patool) tra le altre cose cerca il testo come vuoi tu, e
guarda caso scompatta in memoria e poi usa "grep -r" per trovare
il pattern ciao e fammi sapere se trovi patool per Mac
 
Ps. Comunque anche patool non accetta i caratteri jolly, devi dargli
il nome del file-archivio dove cercare, percio' ho fatto il ciclo for.
 
-- 
Yoda
 

 il pattern ciao e fammi sapere se trovi patool per Mac
Se non combino con pip, dovrebbe esserci al possibilità di compilare
patool direttamente sul Mac, ma sono un po' arrugginito anche con quello
e dovrei rivederim i comandi per compilare pacchetti.


 Riproverò.
 
Uhm.. rinunziaci, perche' patool usa 7z zip arj eccetera.. dovresti
averceli tutti penso ariciao
 
-- 
Yoda
 

 sola o nessuna ciao
Premetto che devo ancora capire e sperimentare... ma elencare le
directory una alla volta potrebbe essere un problema, se il comando non
entra nelle sottodirectory.
 
Comunque grazie delle dritte.


 entra nelle sottodirectory.
 
Non conosci find! per dire, se dai "find / -name "*.7z" ti cerca
addirittura in TUTTO il fs! guarda limitandomi a /usr:
 
[~]_yoda_$: find /usr -name "*.sl"
/usr/share/mc/hints/
mc.hint.sl
 
/usr/share/doc/slrn/examples/
score.sl
 
/usr/share/slrn/slang/
mailcap.sl
 
/usr/share/slrn/slang/
gsort.sl
 
/usr/share/slrn/slang/
slrn.sl
 
/usr/share/slrn/slang/
ttyprint.sl
 
/usr/share/slrn/slang/
search.sl
 
/usr/share/slrn/slang/
varset.sl
 
/usr/share/slrn/slang/
latin2.sl
 
/usr/share/slrn/slang/
tin-art.sl
 
/usr/share/slrn/slang/
posthook.sl
 
/usr/share/slrn/slang/
ispell.sl
 
/usr/share/slrn/slang/
util.sl
 
/usr/share/slrn/slang/
tin-group.sl
 
/usr/share/slrn/slang/
mime.sl
 
/usr/share/slrn/slang/
multipart.sl
 
/usr/share/slrn/slang/
color.sl
 
/usr/share/slrn/slang/
xcomment.sl
 
/usr/share/slrn/slang/
nn.sl
 
 
-- 
Yoda
 




9%20alle%2016.05.48.png?dl=0>
 
a) Se le "tre righe" che dici le dai a manina, invece che fare un file
eseguibile, devi darle mettendo punto e virgola invece di andare a capo,
esempio: > Total.txt; for j in $(cat Lista.txt); do 7z eccetera
 
b) Puoi fare la prova se da te vanno bene quei comandi. Copia una
directory pippo, che contenga file compressi .7z, in /tmp e dai i
seguenti comandi in successione:
Desktop_% find /tmp -name "*.7z" 1>Listatmp
 
Desktop_% > Destinazionetmp
(questo di azzerare la destinazione e' del tutto inutile se il file
non esiste ancora, s'usa farlo quando poi "appendi" l'output)
 
Desktop_% for j in $(cat Listatmp); do 7z l $j -slt 
| sed -n '/^Path/s/Path = //p' >> Destinazionetmp; done
(quest'ultimo comando tutto senza andare a capo, qui l'ho dovuto
fare perche' Slrn protesta se invio testo oltre le 80 colonne)
 
E adesso vedi cosa tutto t'ha fatto, di pericoli non ce ne sono, al
piu' ti spaventi che find ti dice che non ha i permessi per entrare
nelle varie subdir di /tmp, a meno che tu non lo faccia come root,
o amministratore come mi sembra che lo chiami il mac ciao
(o a meno che tu non gli dica di buttare lo standard error in un
file di log invece che a video: 2>/tmp/paperino, come t'avevo gia'
scritto)
 
c) La ricerca la puoi fare greppando Destinazionetmp che t'ha creato
in Desktop/ ariciao
 
-- 
Yoda