Newsgroup: it.comp.os.linux.iniziare
Titolo: script controllo su file

Ciao,
ho la necessità di verificare la presenza di un file all'interno di 
tutto il file system root:
 
 
#!/bin/bash
read -p "Quale parola vuoi cercare? " stringa
if [ -e "$stringa" ];
then
cat $stringa
else
echo "Il file non esiste"
fi
 
In questo modo credo che lo ricerchi nella directory corrente.
Mi potete aiutare per favore ?
Grazie


un file che sia regolare ?
 
 
find <startdir> -type f -name <name>
 
 
oppure
 
find <startdir> -type f | grep <pattern>
 
 
 
man find per altre opzioni
 
 
 
se vuoi fare delle elaborazioni:
 
 
find <startdir> -type f -name <name> | while read
do
	echo $REPLY # emette il path
done
 
 

 In questo modo credo che lo ricerchi nella directory corrente.
 
Si' ma devi dargli il path completo, oppure un numero esatto di "*/" per
ogni subdirectory di "/" dove cerchera'.
 
Ma la strada maestra e' il comando find se lo devi cercare una volta
ogni morte di papa, altrimenti e' immensamente piu' veloce il comando
locate (che e' fatto apposta ed e' praticamente istantaneo e poi non
necessita ne' di path ne' di nome preciso, addirittura te lo puo'
cercare anche senza distinzione di maiuscole/minuscole).
 
 
-- 
Tanti saluti
 


Ho provato così :
 
#!/bin/bash
read -p "Quale parola vuoi cercare? " stringa
find / -name $stringa
 
Funziona ma vorrei anche il file dopo averlo trovato.
Come posso fare ?
 


Vorrei visualizzare il contenuto del file trovato.

 Vorrei visualizzare il contenuto del file trovato.
 
A seconda di cio` che cerchi ti potrebbe accadere alle volte di trovare
moltissimi file, magari migliaia, alcuni dei quali sono directory, altri
invece che hanno estensioni/formati diversi e che dovrebbero quindi
essere aperti con differenti applicazioni.
 
Ma anche senza il catastrofismo delle migliaia di file, e` sufficiente
fare un classico esempio: vuoi cercare il file "sources.list".
 
Se dai il comando
 
$ mlocate 'sources.list'
 
Quante occorrenze trovi? Io 17.
$ mlocate -c 'sources.list'
 
Raffino un po' il comando:
 
$ mlocate -b 'sources.list'
 
ma da me
$ mlocate -bc 'sources.list'
trova ancora 14 file.
 
Cerco pure solo quei file col nome ed estensione solo ed esclusivamente
uguali al nome indicato ma trovo cmq ancora due file:
 
$ mlocate -b '\sources.list'
/etc/apt/sources.list
/usr/share/doc/apt/examples/sources.list
 
Lo script dovrebbe aprirli entrambi o quale dei due?
 
In conclusione IMHO e` meglio se nello script, prima ti fai listare i
file trovati, poi ne scegli uno e lo fai aprire, magari con xdg-open.
 
Vedo che se ad esempio volessi aprire e poter scrivere nel file
/var/log/apt/history.log
basterebbe il comando
 
$ mlocate -b -0 '\history.log' | xargs -0 sudo xdg-open
 
pero` mi sembra una cosa 'tirata per i capelli', .. che non ho :-)
 
 
 
 
 


find / -type f -name "$stringa" | while read   #-type f - prende solo i 
file regolari - stringa racchiusa tra quote doppi nel caso contenga spazi
  do
	[ -r "$REPLY" ] || continue # va al prossimo nome se il file non e 
leggibile
	type=$(file "$REPLY") # ricava il tipo di file
	case "$type" in    # a seconda del tipo esegue il programma apposito
		*ASCII*)
			cat "$REPLY"
			;;
	# cosi anche per gli altri,a seconda del tipo apre il programma apposito
		*)
			# tipo sconosciuto
			# ocoorre decidere che fare
	esac
done
 
 
 
 


	locate filepippo.txt > locate.log
 
Se non esageri con le righe trovate perchè oltre un massimo non riesce a 
gestirle però puoi fare
 
	locate filepippo.txt -n10 > locate.log
 
se anche hai 10 elementi te li butta in file locate.log se ne hai meno 
meglio. Se ce ne sono di più trova solo i primi 10
 
 

Addi' 08 nov 2015, enricoT scrive:

Devi guardare la bellissima risposta di M_M, lui usa mlocate che non e'
altro che locate, perche' gia' dalla Slack c'era slocate linkato al
comando UNIX locate, nella Deb c'e' linkato mlocate (ho il sospetto che
M_M [ ci sei M_M per confermare o smentire? ] ne abbia altri visto che
ha indicato il comando mlocate).
 
Io d'altra parte locate l'ho in uno script per non battere tutte le
volte: "echo; locate -i pippo; echo", lo uso moltissimo.
 
Ho cambiato l'updatedb perche' voglio TUTTI i file, anche quelli di
root, perche' altrimenti non me li mostra.
 
Inoltre l'ho tolto da cron.daily perche' se sento i dischi andare senza
un mio comando entro in paranoia acuta, lo do a mano ogni tanto.
 
 
-- 
Tanti saluti
 

 root, perche' altrimenti non me li mostra.
 
Aggiungo che tra perentesi anche questo, oltre alla velocita' e al minor
tormento dei dischi, e' un punto a favore di locate anziche' find,
infatti find dato da user NON puo' in alcun modo leggere alcune
directory, locate invece tutto il fs.
 
 
-- 
Tanti saluti
 

 un mio comando entro in paranoia acuta, lo do a mano ogni tanto.
 
Io do`
sudo updatedb.mlocate
 
Nel manuale
man updatedb
leggo:
 
SECURITY
Databases  built with --require-visibility no allow users to find names
of files and directories of other users, which they would not otherwise
be able to do.
 
pero` non ho mai provato .. visto che gia` cosi` mi trova cio` che
cerco.
 
 

 contenuto nel pacchetto findutils di GNU, slocate e mlocate.
 
In realta`, almeno in Debian ed Ubuntu, slocate non esiste nei
repository ufficiali, locate e` un pacchetto a se` stante e findutils
contiene solo find e xargs .
 

 cerco.
 
Perche' probabilmente conosci a menadito i file di sistema, ma non e'
cosi' per me. Molto meglio fare cosi' i db (ci sono sempre solo io alla
macchina, quindi la sicurezza non credo che ci entri) piuttosto che dare
locate come root, no?
 
 
-- 
Tanti saluti
 

Addi' 09 nov 2015, M_M scrive:

Mi ricordo che un tempo nella Deb o c'era locate o poi mlocate ha
cambiato formato dei db e opzioni. Allora, venendo dalla Slack,
installavo slocate (bisognava prenderselo fuori pacchetto) perche'
volevo leggere i db della Slack e i formati erano incompatibili.
Poi a un certo punto ho smesso con slocate e mi sono accorto che nella
Deb c'era l'ottimo mlocate.
 
 
-- 
Tanti saluti