[Risolto]"find" molte cartelle con una certa parola nei nomi

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Risolto]"find" molte cartelle con una certa parola nei nomi

Messaggioda eb-ash » mercoledì 12 giugno 2019, 1:45

Ho uno script di ricerca in un archivio, la cui parte di "find" è così:

Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI/\ 00\'s\ -\ 30\'s/00\'s\ -\ 30\'s\ ADV\ Varie/ /Volumes/IMMAGINI/IMMAGINI/\ 40\'s/40\'s\ ADV\ Varie/ /Volumes/IMMAGINI/IMMAGINI/\ 50\'s/50\'s\ ADV\ Varie/ /Volumes/IMMAGINI/IMMAGINI/\ 60\'s/60\'s\ ADV\ Varie/ /Volumes/IMMAGINI/IMMAGINI/\ 70\'s/70\'s\ ADV\ Varie/


Alla fine, come potete vedere, tutte le cartelle in cui viene eseguita la ricerca hanno una certa parola ricorrente nei loro nomi che è "Varie".

Si può fare una soluzione meno... mostruosa, più corta ed elegante? :p
Ultima modifica di eb-ash il venerdì 14 giugno 2019, 14:35, modificato 2 volte in totale.
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
 
Messaggi: 97
Iscrizione: febbraio 2019
Sesso: Maschile

Re: "find" molte cartelle con una certa parola nei nomi

Messaggioda UbuNuovo » mercoledì 12 giugno 2019, 11:42

Non ci si capisce niente, devi studiarti find, non mi pare che tu ne abbia capito il funzionamento.
find è di per sé ricorsivo (se non usi opzioni che ne limitino la ricorsività).
Se all'interno di una directory hai altre sottodirectory e ti interessano quelle con nome 'Varie', basta cercare quel nome, tipo:
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name 'Varie' print
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: "find" molte cartelle con una certa parola nei nomi

Messaggioda eb-ash » giovedì 13 giugno 2019, 10:47

UbuNuovo Immagine ha scritto:Non ci si capisce niente, devi studiarti find, non mi pare che tu ne abbia capito il funzionamento.
find è di per sé ricorsivo (se non usi opzioni che ne limitino la ricorsività).
Se all'interno di una directory hai altre sottodirectory e ti interessano quelle con nome 'Varie', basta cercare quel nome, tipo:
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name 'Varie' print



Il -type d l'avevo già provato ma non risponde. Così come me l'hai messo tu mi dà:

Codice: Seleziona tutto
find: print: unknown primary or operator
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
 
Messaggi: 97
Iscrizione: febbraio 2019
Sesso: Maschile

Re: "find" molte cartelle con una certa parola nei nomi

Messaggioda UbuNuovo » giovedì 13 giugno 2019, 10:50

Non avevo messo il trattino a 'print'
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name 'Varie' -print
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: "find" molte cartelle con una certa parola nei nomi

Messaggioda eb-ash » giovedì 13 giugno 2019, 11:13

il trattino me ne ero accorto... è che questo è il miglior risultato che ottengo:

Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie' -print

/Volumes/IMMAGINI/IMMAGINI/ 00's - 30's/00's - 30's ADV Varie
/Volumes/IMMAGINI/IMMAGINI/ 40's /40's ADV Varie
/Volumes/IMMAGINI/IMMAGINI/ 50's/50's ADV Varie
/Volumes/IMMAGINI/IMMAGINI/ 60's/60's ADV Varie
/Volumes/IMMAGINI/IMMAGINI/ 70's/70's ADV Varie


Se aggiungo il wc -l mi conta il numero delle cartelle

ma io vorrei che contasse il totale dei file contenuti
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
 
Messaggi: 97
Iscrizione: febbraio 2019
Sesso: Maschile

Re: "find" molte cartelle con una certa parola nei nomi

Messaggioda UbuNuovo » giovedì 13 giugno 2019, 12:48

Non l'avevi detto che volevi contare i file.
Perché non provi da solo a trovare una soluzione? È così che si impara.
Ci sono vari metodi per arrivare al risultato, qua metto quelli che mi sembrano più semplici.
se le directory 'Varie' non contengono directory puoi usare ls -1 e contare le righe:
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec ls -1 "{}" \; | wc -l


altrimenti, nel dubbio usa questo:
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec find "{}" -type f \; | wc -l

edit: meglio aggiungere -mindepth 1 -maxdepth 1 al secondo find.
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec find "{}" -mindepth 1 -maxdepth 1 -type f \; | wc -l
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: "find" molte cartelle con una certa parola nei nomi

Messaggioda eb-ash » giovedì 13 giugno 2019, 16:58

UbuNuovo Immagine ha scritto:Non l'avevi detto che volevi contare i file.
Perché non provi da solo a trovare una soluzione? È così che si impara.
Ci sono vari metodi per arrivare al risultato, qua metto quelli che mi sembrano più semplici.
se le directory 'Varie' non contengono directory puoi usare ls -1 e contare le righe:
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec ls -1 "{}" \; | wc -l


altrimenti, nel dubbio usa questo:
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec find "{}" -type f \; | wc -l



Fungono entrambi! Danno due risultati leggermente diversi ma quello me lo approfondisco con calma.

In genere cerco di non chiedere troppo solo quando sono alla disperazione ...

Grazieeee :birra:
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
 
Messaggi: 97
Iscrizione: febbraio 2019
Sesso: Maschile

Re: (Risolto)"find" molte cartelle con una certa parola nei

Messaggioda UbuNuovo » giovedì 13 giugno 2019, 17:00

Di niente.
Hai visto l'edit? Ho aggiunto dopo, il consiglio di usare mindepth e maxdepth.

Ciaux
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: (Risolto)"find" molte cartelle con una certa parola nei

Messaggioda eb-ash » giovedì 13 giugno 2019, 18:59

UbuNuovo Immagine ha scritto:Di niente.
Hai visto l'edit? Ho aggiunto dopo, il consiglio di usare mindepth e maxdepth.

Ciaux


Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI/ -type d -name 'Varie*' -exec ls -1 "{}" \; | wc -l


Questo è quello perfetto perchè conta solo i file mentre quello col doppio find conta anche le cartelle stesse.
Hai fatto bene a farmi notare mindepth e maxdepth, so a cosa servono, me li segno per altri impieghi.

Bene, molto soddisfatto mi ritiro nella mia cripta. Ciao!
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
 
Messaggi: 97
Iscrizione: febbraio 2019
Sesso: Maschile

Re: (Risolto)"find" molte cartelle con una certa parola nei

Messaggioda UbuNuovo » giovedì 13 giugno 2019, 19:26

È il contrario!
Leva la parte
Codice: Seleziona tutto
 | wc -l
e guarda cosa ti stampano i due comandi.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: (Risolto)"find" molte cartelle con una certa parola nei

Messaggioda UbuNuovo » giovedì 13 giugno 2019, 21:19

Scarica la mia struttura di prova http://www.ubaweb.it/appoggio/struttura.tar.gz e scompatta l'archivio
Questa è la struttura di file e dir.
Codice: Seleziona tutto
8-) tree -F struttura
struttura
└── Volumes/
    ├── escluso
    └── IMMAGINI/
        ├── escluso
        └── IMMAGINI/
            ├──  00's - 30's/
            │   ├── 00's - 30's ADV Varie/
            │   │   ├── dir_esclusa/
            │   │   │   └── non lo voglio
            │   │   ├── file1
            │   │   ├── file2
            │   │   ├── file3
            │   │   └── file4
            │   ├── dir_esclusa/
            │   │   └── non lo voglio
            │   └── escluso
            ├──  40's /
            │   ├── 40's ADV Varie/
            │   │   ├── dir_esclusa/
            │   │   │   └── non lo voglio
            │   │   ├── dir_esclusa2/
            │   │   │   └── non lo voglio
            │   │   ├── file1
            │   │   ├── file2
            │   │   └── file4
            │   └── escluso
            ├──  50's/
            │   ├── 50's ADV Varie/
            │   │   ├── file1
            │   │   ├── file3
            │   │   └── file4
            │   └── escluso
            ├──  60's/
            │   ├── 60's ADV Varie/
            │   │   ├── dir_esclusa/
            │   │   │   └── non lo voglio
            │   │   ├── file2
            │   │   ├── file3
            │   │   └── file4
            │   └── escluso
            ├──  70's/
            │   ├── 70's ADV Varie/
            │   │   ├── file1
            │   │   └── file4
            │   └── escluso
            └── escluso

18 directories, 28 files
8-)



i file da contare sono quelli dentro le dir '*Varie', con nome "fileN" dove "N" è un intero da 1 a 4, altri file e dir non devono essere conteggiati.
Da dentro la directory 'struttura' eseguo il codice più robusto:
Codice: Seleziona tutto
8-) find Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec find "{}" -mindepth 1 -maxdepth 1 -type f \; | wc -l
15

Per vedere che non ci siano "intrusi" provo il codice senza il conteggio:
Codice: Seleziona tutto
8-) find Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec find "{}" -mindepth 1 -maxdepth 1 -type f \;
Volumes/IMMAGINI/IMMAGINI/ 70's/70's ADV Varie/file4
Volumes/IMMAGINI/IMMAGINI/ 70's/70's ADV Varie/file1
Volumes/IMMAGINI/IMMAGINI/ 00's - 30's/00's - 30's ADV Varie/file4
Volumes/IMMAGINI/IMMAGINI/ 00's - 30's/00's - 30's ADV Varie/file3
Volumes/IMMAGINI/IMMAGINI/ 00's - 30's/00's - 30's ADV Varie/file1
Volumes/IMMAGINI/IMMAGINI/ 00's - 30's/00's - 30's ADV Varie/file2
Volumes/IMMAGINI/IMMAGINI/ 50's/50's ADV Varie/file4
Volumes/IMMAGINI/IMMAGINI/ 50's/50's ADV Varie/file3
Volumes/IMMAGINI/IMMAGINI/ 50's/50's ADV Varie/file1
Volumes/IMMAGINI/IMMAGINI/ 60's/60's ADV Varie/file4
Volumes/IMMAGINI/IMMAGINI/ 60's/60's ADV Varie/file3
Volumes/IMMAGINI/IMMAGINI/ 60's/60's ADV Varie/file2
Volumes/IMMAGINI/IMMAGINI/ 40's /40's ADV Varie/file4
Volumes/IMMAGINI/IMMAGINI/ 40's /40's ADV Varie/file1
Volumes/IMMAGINI/IMMAGINI/ 40's /40's ADV Varie/file2
8-)

Ora provo con find e ls:
Codice: Seleziona tutto
8-) find Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec ls -1 "{}" \; | wc -l
19
8-)

19 è sbagliato! Vado a vedere cosa viene stampato:
Codice: Seleziona tutto
8-) find Volumes/IMMAGINI/IMMAGINI -type d -name '*Varie*' -exec ls -1 "{}" \;
file1
file4
dir_esclusa
file1
file2
file3
file4
file1
file3
file4
dir_esclusa
file2
file3
file4
dir_esclusa
dir_esclusa2
file1
file2
file4
8-)

vengono stampate le directory interne alle directory '*Varie'

P.S. Evita apostrofi, virgolette e spazi nei nomi dei file.
Per il "Risolto" usa le parentesi quadrate, non le tonde.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: [Risolto]"find" molte cartelle con una certa parola nei

Messaggioda eb-ash » venerdì 14 giugno 2019, 15:45

Sì, in effetti hai ragione. Per qualche oscuro motivo però io non riesco ad ottenere mai il risultato giusto, arrivo persino a 20 anzichè 19.

Non me ne ero accorto perchè nelle directory "Varie" non metto mai altre cartelle. Inoltre per ottenere il risultato giusto io devo fare

Codice: Seleziona tutto
'*Varie'


con l'asterisco dalla parte sin perchè la parola ricercata è sempre al fondo della stringa. L'ho trovato logico e ho pensato fosse giusto così.

Nella mia situazione posso accettarlo perchè i risultati sono giusti non avendo mai ulteriori sottocartelle, però mi piacerebbe capire il perchè.

Ho provato a mettere il comando
Codice: Seleziona tutto
+ 2>/dev/null
che è necessario in certe situazioni per aggirare un problema di permessi ma restituisce sempre 0

le mie conoscenze di arti esoteriche non mi permettono allo stato di risolvere l'arcano, ma conto studiando il find (bsd/os x) di riuscirci tra 1 o 2 secoli....

Gli apostrofi, apici varie, li devo tenere perchè l'archivio viene anche usato tramite mediacenter per cui necessito di titoli belli da vedere e per motivi linguistici
e quindi non posso semplificarmi le cose come potrei fare badassi solo agli aspetti tecnici...



:D Sempre grazie 1000!
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
 
Messaggi: 97
Iscrizione: febbraio 2019
Sesso: Maschile

Re: [Risolto]"find" molte cartelle con una certa parola nei

Messaggioda UbuNuovo » venerdì 14 giugno 2019, 16:19

Io ho usato una forma più generica '*Varie*' ma, se sei sicuro che i nomi finiscano sempre con 'Varie', fai bene ad usare la forma più specifica, con un solo asterisco dalla parte che può variare.

Codice: Seleziona tutto
2>/dev/null
serve per non stampare eventuali messaggi di errore.

Per i problemi che incontri dovresti individuarne la causa vedendo l'output (eliminando il codice di conteggio).

Gli apostrofi o altri caratteri evitabili, puoi lasciarli; basta che ti ricordi di gestirli in maniera corretta altrimenti potrebbero originare problemi.
Ciaux
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: [Risolto]"find" molte cartelle con una certa parola nei

Messaggioda eb-ash » lunedì 17 giugno 2019, 16:07

[quote="UbuNuovo Immagine

Per i problemi che incontri dovresti individuarne la causa vedendo l'output (eliminando il codice di conteggio).
[/quote]


Alla fine dopo molte prove ho visto che avevo dei problemi anche con il codice che mi sembrava giusto
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI/ -type d -iname '*Varie' -exec ls -1 "{}" \;| wc -l


ho risolto cercando una stringa con due parole. Dato che tutte le cartelle terminano con "... ADV varie" anziche cercare solo l'ultima parola parto dalla penultima e va bene
Codice: Seleziona tutto
"*ADV Varie"

Chissà perchè... :occhiaie:

con questo invece:
Codice: Seleziona tutto
find /Volumes/IMMAGINI/IMMAGINI/ -type d -name "*Varie" -mindepth 1 -maxdepth 2 -exec ls -1 "{}" \;| wc -l


mi conta i file invisibili ".ds_store" ma lo risolvo se metto:
Codice: Seleziona tutto
 -not -path '*/\.*'


Ma preferisco sempre il primo visto che è più corto
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
 
Messaggi: 97
Iscrizione: febbraio 2019
Sesso: Maschile

Re: [Risolto]"find" molte cartelle con una certa parola nei

Messaggioda UbuNuovo » martedì 18 giugno 2019, 17:48

Bene! È così che si impara!
I file con il punto iniziale chiamali "nascosti".
Ciaux
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3341
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 4 ospiti