Newsgroup: it.comp.macintosh
Titolo: contare i caratteri di documenti di testo

Salve a tutt*,
sto lavorando a un libro, e mi occorrerebbe sapere quanti caratteri
(da cui poi ricaverò il numero di pagine) ha, nell'insieme, tutto il
materiale che ho raccolto. I documenti di testo sono parecchi
(svariate centinaia), e sono inseriti in un albero di cartelle
ESTREMAMENTE nidificate.
La cosa che mi chiedo è la seguente... c'è un modo per contare in un
colpo solo i caratteri di tutti i documenti (o di gruppi di documenti)
o di fare un merge di tutti i documenti per poi contare i caratteri
con BBEdit?
Qualcuno sa se forse la versione completa di BBedit fa questo tipo di
operazione (e se lo fa la demo)?
Grazie mille per l'aiuto

 
Ecco un modo per farlo da terminale:
-vai nella directory base
-dai il comando
	find . -type f -exec cat {} \; | wc
-avrai in output il numero di linee, parole e caratteri

 find . -type f -exec cat {} \; | wc
grazie mille!!!
Per la famosa storia del pesce e dell'insegnare a pescare, potresti, se
ti va, spiegarmi la sintassi di questo comando?
Ancora grazie infinite
-- 
- Oggi non vengo a mensa.
- Oicchč tussči? Astemia di'mmangiare?
tirante
http://informaticaemotiva.splinder.it

 ti va, spiegarmi la sintassi di questo comando?
Dai mi cimento io, per prima cosa ci sono due spiegazioni possibili:
PRIMA SPIEGAZIONE
lancia il terminale poi digita "man find" e dai invio, quando hai finito
digita "man wc" nuovamente seguito da invio. Se non sai usare man prima
di cominciare digita "man man".
SECONDA SPIEGAZIONE
wc e' un programma che conta le lettere, le parole o le righe, puo' fare
questo sia accettando come parametro il nome di un file, e in questo
caso lavorerà su questo file, sia senza un file specificato e in
quest'ultimo caso usera' lo standard input, cioe' il programma dopo
lanciato lavorera' su quello che viene immesso nella console.
find e' un programma che invece cerca dei file, bisogna dirgli in quale
directory cercare e dargli delle specifiche sui file che deve trovare,
fatto questo find stampera in uscita il nome dei file che soddisfano le
condizioni da noi richieste.
Eventualmente gli si puo' dire di eseguire un comando che noi
desideriamo sui file.
Infine c'e' cat che riversa il contenuto di un file sullo standard
output, che nel nostro caso e' la console, e' interessante notare che se
a cat (come a wc e in genere ad un sacco di comandi di cli) non diamo un
nome di file come parametro questo prende in ingresso lo standard input
e lo riversa sullo standard output quindi ci troviamo lo stesso testo
due volte in console.
Ora che conosciamo i comandi dobbiamo assemblarli e lo facciamo usando
la pipe, cioe' la lineetta verticale, che e' uno strumento messo a
disposizione dalla shell, l'interprete dei comandi. Questa pipe
concatena lo standard output del comando alla sua sinistra con lo
standard input di quello alla sua destra dando in pratica in pasto al
secondo comando il risultato del primo.
find .
cerca a partire dalla directory corrente che e' la directory "." se non
vogliamo che find scenda nelle sottodirectory dobbiamo dirglielo
esplicitamente
find . -type f
cerca i file di tipo file, puo' sembrare stupido ma find lavora su tutti
gli elementi del filesystem e trova quindi anche directory, link, block
device e altri oggetti che nel nostro caso non vogliamo
find . -type f -exec cat
su questi file che hai trovato esegui un cat buttando quindi in pratica
su stdout (standard out) il contenuto dei file che trova, dobbiamo pero'
passare a cat come parametro il nome di ogni singolo file, ma come?
find . -type f -exec cat {} 
cosi'! in effetti {} assumera' per ogni file trovato il nome del file
quindi per tutti i file che find trova viene eseguito di fatto un "cat
filetrovato". Ora dobbiamo chiudere l'exec con 
find . -type f -exec cat {}  \;
il ; dice alla console che un comando e' finito e ne comincia un altro,
il \ serve a proteggere il ; altrimenti find lo interpreterebbe come
parte del parametro exec.
find . -type f -exec cat {}  \; | wc
prendi tutto quello che esce da sinistra (il contenuto di tutti i file
di dati) e passalo in ingresso a wc
Uala', i giochi sono fatti!
Lungo?
Ciao
Andrea

 
Suppaman ti ha dato un'ottima spiegazione, non avrei saputo esser più 
chiaro. Se lavori spesso con i file di testo ti consiglio caldamente di 
studiarti la shell, ci puoi tirar fuori cose incredibili e che si 
sognano molti rinomati word processor!! Per non parlare di perl!

 sognano molti rinomati word processor!! Per non parlare di perl!
Chi ha detto awk ?? Ahh, hai detto sed..

 find . -type f -exec cat {} \; | wc
Ho fatto una prova, confrontando il risultato di questa serie di comandi
con quello ottenuto con wc ./* (nella cartella non c'erano
sottocartelle).
Nel primo caso ottengo questo risultato:
2132    8943   84253
Nel secondo
       0       1      34 
       6       9     321 
      19      42     618 
      45      67    1085 
       7      14     351 
      19     480    3474 
    2026    8282   71698 
      10      45     524 
    2132    8940   78105 total
Confrontando i totali, il numero di linee č lo stesso, quello di parole
cambia di poco, ma quello dei caratteri č notevolmente diverso.
Ho riprovato lasciando solo due file nella cartella, per cercare di
semplificare un po' le cose sperando di capirci qualcosa e i risultati
sono stati ancora piů assurdi:
col pipe:
      25      59    7087
con wc ./*
       6       9     321 
      19      42     618 
      25      51     939 total
-- 
Ve lo meritate Gil Amelio!

 wrote:
fai un ls -al

 fai un ls -al
E' il .DS_Store che incasina tutto! Il pipe becca pure quello.


 E' il .DS_Store che incasina tutto! Il pipe becca pure quello.
Io correggerei così il pipe:
find . \! -n"ame ".*" -type f -exec cat {} \; | wc
così si evitano direttamente tutti i file invisibili (perlomeno quelli
che iniziano per ".").


 E' il .DS_Store che incasina tutto! Il pipe becca pure quello.
Io correggerei così il pipe:
find . \! -name ".*" -type f -exec cat {} \; | wc
così si evitano direttamente tutti i file invisibili (perlomeno quelli
che iniziano per ".").
-- 


 find . \! -name ".*" -type f -exec cat {} \; | wc
Adesso funziona quasi:
      25      50     939
 
Mentre wc ./* dà:
       6       9     321 
      19      42     618 
      25      51     939 total
Evidentemente il cat ha saldato l'ultima parola del primo file con la
prima del secondo.


 find . \! -name ".*" -type f -exec cat {} \; | wc
Precisazione: il "\" prima del punto esclamativo credo non sia
necessario.
-- 
Ciao,
  Marco.

 necessario.
Già, hai ragione. Tra l'altro, un'altra precisazione importante da fare
è che wc è fatto per elaborare file di testo semplice. Se i documenti su
cui sta lavorando tirante sono .doc o .rtf il calcolo è tutto sballato,
perché prende in considerazione anche la formattazione.


 perché prende in considerazione anche la formattazione.
Urca, sono tutti file .rtf.... cercherņ di fare una conversione di massa
in txt.
Grazie infinite a tutti per le spiegazioni chiarissime ed esaustive,
spero di poter presto ricambiare...
tirante


 
Ops non avevo pensato ai perfidi .DS_Store e credevo che i file fossero 
plain text.. per la conversione in massa degli rtf prova con questo
http://www.bluem.net/downloads/rtf2txt_en/