Newsgroup: it.comp.os.linux.iniziare
Titolo: cerca all'interno del file

devo rimuovere tutti i file che al loro interno contengono xyz
Allora:
ls -Rla | grep xyz
mi lista tutti quei file, sempre se non ho sbagliato da qualche parte.
Però come faccio per cancellarli?
io avevo pensato:
rm | ls -R | grep xyz
Però non funziona.
Qualcuno mi aiuta?
Ciao e grazie

 Però come faccio per cancellarli?
Ma devi cancellare il files con il nome che contiene xyz o che hanno al
loro interno la stringa xyz?
Ciao
  Andrea
-- 
 
www.linux.it
                           ->       Il punto di partenza
 
www.google.com/advanced_group_search
   ->       La risposta alle tue domande
 
www.nic.it/NA/netiquette.txt
           ->       Comportarsi bene in rete
 
www.google.com
                         ->       Se ancora non hai trovato

 Però come faccio per cancellarli?
Se ho capito bene devi cancellare i file il cui nome contiene la stringa
"xyz" a partire da un certo punto del filesystem (per esempio /home/user )
# find /home/user -name "*xyz*" -exec rm \{\} \;
Se non vuoi fare casino al primo tentativo prova con:
# find /home/user -name "*xyz*" -exec rm -i \{\} \;
-- 
Enrico Bodo  -   Postdoc Fellow       
University of Rome "La Sapienza"    
Department of Chemistry        

 devo rimuovere tutti i file che al loro interno contengono xyz
questo e' uno script bash che uso per trovare i file che contengono una
determinata stringa. non e' molto raffinato, ma se ti accontenti te lo
regalo :D
#!/bin/bash
for f in $1
  do
  if [ -d "$f" ]
      then
      echo > /dev/null
#includero' una routine per le sottocartelle un giorno :P
  else
      cat "$f" | grep "$2" > /dev/null
      if [ $? = 0 ]
	  then
	  echo trovato "$2" : "$f"
      fi
  fi
sostituendo quel echo trovato "$2" : "$f" con
rm -f "$f"
dovresti adempiere al tuo compito
lancia poi lo script ad esempio con 
./nomescript "*.txt" xyz
per applicarlo solo a determinati tipi di file
-- 
buona digestione post cenone

 loro interno la stringa xyz?
a me interessava il primo, ma per cultura personale era interessante anche
il secondo.

 # find /home/user -name "*xyz*" -exec rm -i \{\} \;
grazie.
complicatino il comando!!!
:-((

 buona digestione post cenone
per quello non c'è problema, il problema è digerire lo script.
Non è particolarmente difficile, ma nemmeno semplice!
grazie mille.


Non e' complicato. E' molto semplice in realta' e ti consiglio di imparare 
ad usare find in questo modo perche' e' molto utile.
/home/user e' il punto di partenza della ricerca, puoi indicare anche / per
ricercare su tutto il filesystem. L'opzione -name dice ovviamente a find di
cercare per nome (puo' cercare anche per data, ultimo accesso, ultima
modifica, dimensione, appertenenza, permessi, tipo ecc.). 
Find accetta le wildcard (cioe' * e ? nel nome), ma questi caratteri
speciali vanno protetti con le virgolette perche' altrimenti la shell prima
di passare la stringa *xyz* a find la "espanderebbe" cioe' sostituirebbe a
*xyz* l'elenco di tutti i file che hanno nel nome xyz che si trovano nella
directory corrente. Il che non va bene perche' tu vuoi che sia find a
interpretare gli * e non la shell.
La seconda parte del comando che segue l'opzione -exec sembra complicata, ma
semplicemente dice a find di cancellare quello che trova. Le barre \ servono
anch'esse ad evitare che la shell interpreti i caratteri speciali {} e ; che
hanno significati particolari. Il carattere \ fa lo stesso effetto delle
virgolette (piu' o meno) e fa in modo che la shell non si interessi di cosa
c'e' dopo e non lo interpreti in modo speciale. 
Per esempio: e' una convenzione di find che il comando seguente ad -exec
finisca con il ;. La shell vedrebbe il ; come la terminazione di un comando
(esattamente come l'invio) ma tu vuoi che sia find ad interpretare ; e non
la shell. Quindi il comando sembra diventare un po' complicato. In realta'
senza virgolette e \ e' semplice.
Sotto unix in generale (almeno sulle shell che conosco: tcsh e bash) e' la 
shell la prima ad interpretare la riga di comando e a sostituire ai vari 
simboli speciali il loro significato. Percio' se bash trova un f* passera' 
al comando  tutti nomi di file che cominciano per f che si trovano nella 
directory corrente. Questo e' un grande vantaggio perche' i comandi (ls, cp, 
mv ecc. ecc.) non devono interpretare *, ma si fidano di quello che fa la 
shell. Cosi' il comportamento e' uniforme per tutti i comandi e non c'e' 
rischio di sbagliare. Alcuni comandi come find pero' a loro volta sono 
capaci di interpretare (a modo loro) * e quindi va detto alla shell di non 
farlo. Le virgolette e i "caratteri di escape" come per esempio la barra \ 
servono proprio a questo.
Se prendi confidenza con questo meccanismo risultera' facile costruire 
comandi di find che risolvono questioni complicate in pochi secondi, basta 
fare due o tre prove:
dove sono i file piu' grossi di 5M? (qualcuno ha deciso di mettere mp3 
nell'area backuppata?)
# find /home -size +5000k -exec ls -lsh \{\} \;
che link ha creato l'utente pippo?
# find /home/pippo -type l -user pippo -exec ls -l \{\} \; 


 fare due o tre prove:
ok, grazie mi č tutto chiaro.
Ciao e grazie

 sono come in c/c++?
Temo che non ci incastri nulla :)
-- 
Ikitt

 da man find:
ok, io pensavo che avesse a che fare con rm, quindi cercavo il suo man.
Mi permetto di aggiungere la traduzione dal mio man find in italiano.
       -exec comando ;
              Esegue comando; vero se è ritornato lo stato 0. Tutti i
successivi  argomenti  di  find  sono  con-
              siderati  argomenti  del  comando fino a che non è incontrato
un argomento composto da `;'. Ovunque
              compaia negli argomenti del comando, non solo negli argomenti
dov'è da sola come in alcune versioni
              di  find,  la  stringa  `{}'  è  rimpiazzata  dal  nome di
file che si sta attualmente processando.
              Entrambi questi costrutti possono aver bisogno di essere
prefissi da un `\' (escaped)  o  racchiusi
              tra  virgolette  per proteggerli dall'espansione della shell.
Il comando è eseguito nella directory
              di avvio.
Ciao e grazie