Newsgroup: it.comp.os.linux.sys
Titolo: script per cancellare dir e files

è da un po' che ci sbatto su ....
ho fatto un script che genera dei nomi di file o directory da cancellare
li inserisce in un'altro file, prende l'input da questo file e si mette
a cancellare.
Il problema nasce quando ci sono degli spazi vuoti nel nome del file.
Ho provato con sed a inserire gli apici all'inizio e alla fine della
riga ma non funziona ugualmente.
Qualche dritta?
-- 
massimiliano adamo

riga ma non funziona ugualmente.
Hai provato ad "escapare" gli spazi con un backslash?
Tipo: nome\ di\ file\ con\ spazi
Ciao,
luigi

 riga ma non funziona ugualmente.
Se gli apici li metti intorno al nome del file dovrebbe funzionare.
Davide

 a cancellare.
Ti basta un 
  find /dir-di-partenza -opzioni_di_selezione  -exec rm -f \{\} \;
ciao, Andrea


of course.
se lo fai su riga di comando funziona ... ma da script no.
-- 
massimiliano adamo

 è da un po' che ci sbatto su ....
e alla fine ce l'ho fatta, in un modo assurdo ma ce l'ho fatta:
#!/bin/bash
echo \#\!/bin/sh >./my_input_file
find . -type d | sed -e "s/\.\//\"\.\//g" | sed -e "s/$/\"/g" | sed -e "/\.\"/D" | sed -e "s/\"\./rmdir -p \"\./g" > ./my_input_file
chmod +x ./my_input_file
./my_input_file
bello vero? ... fa un po' schifo lo so, ma funziona :)
p.s.: scusate per lo sformaento delle 72 colonne ... ma non le ho
      inventate io le pipe
-- 
massimiliano adamo

Io ho un problemino analogo ma forse piu' "cattivo".
Voglio cercare tutti i processi che hanno definito una variabile d'ambiente.
L'idea e' quella di ispezionare il file /proc/N/environ dove N e' pid del
processo.
Il problema e' che a me interessa trovare i processi in cui la variabile
contiene *esattamente* quel valore e non sia semplicemente contenuto come
sottostringa (per esempio tutte le occorrenze dove compare esattamente
HOME=/home/pippo tralasciando per esempio HOME=/home/pippobaudo).
Nessun problema se non fosse che le variabili sono separate dal carattere
NUL anziche' un piu' comodo \n. Ho provato a far sostituire il NUL con un
newline da sed ma non ne vuole sapere.
Suggerimenti?
Grazie.
--
Alessandro Staltari
staltari(a)
geocities.com

 HOME=/home/pippo tralasciando per esempio HOME=/home/pippobaudo).
man grep
...
-w, --word-regexp
              Select  only  those  lines  containing matches that
              form whole words.
Ma (se non ho capito male quello che devi fare) dovresti usarlo in un
secondo passaggio, poiché, mi pare di aver visto che ciò che sta in 
/proc/N/environ è scritto tutto su una riga.
Cioè: 
1) al primo passaggio butteresti l'output di grep in un file
2) al secondo pasaggio avresti un file con le corripsondeneza su righe
separate e lì useresti tranquillamente "grep -w"
ciao
-- 
massimiliano adamo

 Suggerimenti?
Usa "tr":
tr '\0' '\n'
dovrebbe funzionare, dipende dalla versione di "tr".
bye,
-- 
  Piergiorgio Sartor


Funziona alla grande.
Grazie.
Alessandro Staltari
staltari(a)
geocities.com

 /proc/N/environ è scritto tutto su una riga.
In fatti questo era il problema. Comunque ho risolto con "tr".
Grazie ugualmente.
--
Alessandro Staltari
staltari(a)
geocities.com

 bello vero? ... fa un po' schifo lo so, ma funziona :)
Sinceramente non capisco il problema, io ho script
che manipolano file e sono "space proof", ma con
piu` semplici accorgimenti..,.
Per esempio:
gawk '{print "rm \""$0"\""}' file_di_nomi_file.txt | bash
Funziona con gli spazi ed altre amenita`...
L'unico dubbio potrebbe la presenza di  "!" nel
nome, ma si puo` aggirare anche quello. Lo lascio
come esercizio per casa :-)
bye,
-- 
  Piergiorgio Sartor

 gawk '{print "rm \""$0"\""}' file_di_nomi_file.txt | bash
Questione di parrocchia: tu sei un devoto del dio awk e io sono pio
devoto del dio sed.
'parte le minXXiate: per il momento non conosco ancora awk ;)
-- 
massimiliano adamo

 'parte le minXXiate: per il momento non conosco ancora awk ;)
Beh, "awk" e` parecchio interessante, quando serve
farsi un mini-parser al volo, e` molto comodo.
bye,
-- 
  Piergiorgio Sartor

 sed 's/^/rm "/g' file_di_nomi_file.txt | sed 's/$/"/g' | bash
Si aspetta ... e lo stesso che ho fatto io: tu ne hai riunite due
e nella mia riga c'era in più il comando per generare l'input 
per quel file_di_nomi_file.txt (find . -quellocheera). Quello serve
anche: non vorrai metterci dentro i nomi a manina?
Bellissima idea invece quella del finale: "| bash". Non ci avevo mai
pensato.
-- 
massimiliano adamo

 
Oltre alle cose del precedente messaggio, avevo aggiunto un'altra pipe
per cancellare una riga inutile generata dal comando "find . -type d"
... questa ovviamente devi aggiungerla anche.
ok, ok ... complimenti per "| bash": non lo sapevo che poteva
funzionare .... sapevo "sh nome_file" per i file che non hanno i
permessi di esecuzione (e in pratica è questo quello che hai fatto).
-- 
massimiliano adamo

 ... questa ovviamente devi aggiungerla anche.
Uhm, che riga inutile, la prima? Quella che
contiene "."?
Forse si puo` risolvere con:
find . -type d | tail +2 | ...
Ma anche "sed -e" va bene.
Con "awk", si puo` filtrare il tutto al volo,
con un unico programma, quindi.
L'idea di usare "bash" in pipe nasce dal fatto
che, come scritto prima, "awk" consente di farsi 
un mini-parser al volo, quindi di trasformare
(o compilare) file da una sintassi ad un'altra.
Ed ovviamente puoi compilare "qualcosa" in
linguaggio bash... :-)
bye,
-- 
  Piergiorgio Sartor

 contiene *esattamente* quel valore e non sia semplicemente contenuto come
[..]
# cat /proc/853/environ | tr '\0' '\n'
-- 
- Le scaglie della mia corazza sono come scudi dieci volte piu' potenti
  i miei denti sono spade, i miei artigli lance, lo sferzare della 
  mia coda una saetta, le mie ali un uragano ed il mio alito MORTE !

 riga ma non funziona ugualmente.
Arrivo un po' tardi, ma questo non funziona?
#!/bin/bash
for i in `cat lista_coi_nomi_da_cancellare`;
do
    rm "$i"
done
-- 
Saluti,
    Mardy
http://castellina.org/interlingua

 Arrivo un po' tardi, ma questo non funziona?
spiacente: non funziona .... guarda gli altri messaggi ;)
-- 
massimiliano adamo

 spiacente: non funziona .... guarda gli altri messaggi ;)
A me funziona. L'hai provato? Le virgolette sono il punto chiave.


 --
Purtroppo ho perso i primi post...comunque potresti fare una cosa del
genere:
rm -r $(find / -name [file o dir])
potresti poi creare una variabile che catturi il tuo input e passarla al
comando di cui sopra...magari ci fai una interfaccia carina in console....e
cosě via !!
Ciao
Alessandro

 done
Uhm, in alcune shell, se il nome del
file ha spazi, vengono passati due
parametri a "for" (e non uno).
Non so la bash come si comporti, 
bisognerebbe fare una prova...
bye,
-- 
  Piergiorgio Sartor

 A me funziona. L'hai provato? Le virgolette sono il punto chiave.
Si che l'ho provato ... prima che tu postassi.
Il punto chiave sono i nomi con gli spazi .... se hai dei nomi file con
degli spazi puoi usare tutte le virgolette che vuoi, ma non funziona. 
-- 
massimiliano adamo

 rm -r $(find / -name [file o dir])
Troppo facile .... se ci sono degli spazi nei nomi di file non funziona.
Puoi mettere tutte le virgolette che vuoi: continuerà a non funzionare.
Ti sembriamo scemi ad aver usato awk o script sed con 3 e 4 pipe? ;)
 
-- 
massimiliano adamo

 writes:
MA> Troppo facile .... se ci sono degli spazi nei nomi di file non
MA> funziona.  Puoi mettere tutte le virgolette che vuoi: continuerà a
MA> non funzionare.
$ find -print0 | xargs -0 rm
MA> Ti sembriamo scemi ad aver usato awk o script sed con 3 e 4 pipe?
MA> ;)
Forse, ma forse è meglio non giudicare per così poco.
Saluti
Marco

 done
Ho provato, non funziona con bash v2.05a.
Se i nomi hanno spazi, li prende come due
separati parametri.
bye,
-- 
  Piergiorgio Sartor

 degli spazi puoi usare tutte le virgolette che vuoi, ma non funziona. 
Scusa, hai ragione. Cosě dovrebbe andare:
while read i
do
    rm -f "$i"
done < file_con_lista_nomi
