Newsgroup: it.comp.os.linux.sys
Titolo: Comando rm

Ciao a tutti,
ho n problema nella cancellazione di una directory contenente circa 5000 
file.
Se eseguo il comando :
 
rm -r /home/pippo/cartella
 
mi cancella la cartella e il suo contenuto.
 
Ma se volessi cancellare solo il contenuto?
 
Grazie


rm -r /home/pippo/cartella/*
 
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
 
www.robyt.eu
 
 


 
Grazie 1000

 rm -r /home/pippo/cartella/*
 
Questo, pero`, non credo cancelli i file che
iniziano con '.' (punto).
 
NON e` il caso di provare:
 
rm -r /dir/.*
 
O meglio: non fatelo a casa da soli... :-)
 
bye,
 
-- 
 
piergiorgio

 O meglio: non fatelo a casa da soli... :-)
 
LOL! Pero' lo faccio da sempre, solo che occorre dare due volte il
comando rm:
 
rm -r /home/pippo/cartella/*
rm -r /home/pippo/cartella/.*
 
 
-- 
Tanti saluti
 

 rm -r /home/pippo/cartella/.*
 
Oh, ma la cosa diventa divertente se uno
ha delle dir che iniziano con il punto
(dentro la dir da cancellare), perche` puo`
venire la tentazione di fare:
 
rm -r dir/.*/*
 
Il che da i risultati migliori da root,
chiaramente...
 
Ovviamente, funziona anche:
 
rm -r .*/*
 
NON fatelo!
 
bye,
 
-- 
 
piergiorgio

 NON fatelo!
 
LOL ma tanto prima o poi tutti concelliamo qualcosa che non si deve, io
una sola volta molto tempo fa, da allora mi sono abituato a rileggere
tutti i comandi dati come root, ma mettere il -i a rm e' assurdo.
 
 
-- 
Tanti saluti
 

 LOL ma tanto prima o poi tutti concelliamo qualcosa che non si deve, 
 
si, ma di questo ne vogliamo parlare? 
grep ARG_MAX /usr/include/linux/limits.h
 
Verra' un giorno in cui lancerai il comando e ti dira':
"argument list is too long" 
 
ma non ti fare ingannare dal 131mila, perche' quelli sono byte e non numero di 
argomenti. 
 
Infatti questo fallisce: 
touch {1..314354}
 
Stranamente rm accetta un argomento in piu' e fallisce solo questo: 
rm {1..314355}
 
(p.s.: no, non ho un alias per 'rm' che mi aggiungerebbe una opzione)

 (p.s.: no, non ho un alias per 'rm' che mi aggiungerebbe una opzione)
 
stupido me.... "touch" e' una stringa piu' lunga di "rm". Per questo fallisce
prima di "rm" :)


Non mi sembra un problema cosi grosso
Gia è difficile che un applicativo abbia bisogno piu di 131000 chars di 
argv e poi se cosi fosse basta alzare il limite e ricompilare il kernel 
(e forse la libc) oppure aggirare il limite con un file (piu facile)
 
 

 Non mi sembra un problema cosi grosso 
 
se usi "rm *" è un problema... perché la "*" si espande e ti dice 
"argument list is too long". 
E non si ricompila il kernel per poter fare rm * :) 
 
 
 
-- 
Massimiliano Adamo

Ah gia', perche' becca . e .. 
 
Per quale motivo il primo non li becca? Il secondo ha in più un /* 
 
-- 
Ci sono 10 tipi di persone al mondo: quelle che capiscono il sistema binario
e quelle che non lo capiscono.

 
 
Perche` e` buono:
 
rm -r test_rm/.*
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘test_rm/.’
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘test_rm/..’
 
Espande "test_rm/.*" in:
 
test_rm/. test_rm/..
 
Nel secondo caso, pero`, espande "test_rm/.*/*" in:
 
test_rm/../file_test_rm test_rm/../test_rm
 
"file_test_rm" e` nella dir superiore e viene cancellato,
cosi` come tutto il resto eventualmente presente, inclusa
la dir stessa "test_rm".
 
bye,
 
-- 
 
piergiorgio

la dir stessa "test_rm".
 
Boh, ho provato e i files nella directory superiore (quella da cui
lancio il comando) rimangono.
 
#rm -r provadir/.*/*
 
cancella la provadir, ma...
 
#rm: impossibile rimuovere
"provadir/../VMwareTools-7.8.8-328052.tar.gz": No such file or
directory


 directory
 
Questo vuol dire che quel file non esiste.
Probabilmente non e` dove pensi tu...
 
Hai provato con un piu` semplice:
 
echo provadir/.*/*
 
Questo ti dice esattamente come viene espanso il glob.
 
bye,
 
-- 
 
piergiorgio

echo provadir/.*/*
 
root@debian-squeeze:~# mkdir provadir
root@debian-squeeze:~# mkdir provadir/.sottodir
root@debian-squeeze:~# mkdir provadir/sottodir
root@debian-squeeze:~# echo provadir/.*/*
provadir/../provadir provadir/./sottodir
provadir/../VMwareTools-7.8.8-328052.tar.gz
provadir/../vmware-tools-distrib
root@debian-squeeze:~# ls
provadir  VMwareTools-7.8.8-328052.tar.gz  vmware-tools-distrib
root@debian-squeeze:~# ls -la provadir/
totale 16
drwxr-xr-x  4 root root 4096 15 ago 11.22 .
drwx------ 13 root root 4096 15 ago 11.22 ..
drwxr-xr-x  2 root root 4096 15 ago 11.22 sottodir
drwxr-xr-x  2 root root 4096 15 ago 11.22 .sottodir
root@debian-squeeze:~# rm -r provadir/.*/*
rm: impossibile rimuovere "provadir/./sottodir": No such file or
directory
rm: impossibile rimuovere
"provadir/../VMwareTools-7.8.8-328052.tar.gz": No such file or
directory
rm: impossibile rimuovere "provadir/../vmware-tools-distrib": No such
file or directory
root@debian-squeeze:~# ls
VMwareTools-7.8.8-328052.tar.gz  vmware-tools-distrib
root@debian-squeeze:~# 


 Il file è lì nella directory in cui do il comando, accanto alla

Interessante.
 
Il motivo e` che il file viene dopo il nome
della directory (alfabeticamente).
 
Per cui, lui cancella "provadir" e quindi
il path "provadir/../file" non esiste piu`.
 
Di conseguenza: "No such file or directory".
 
bye,
 
-- 
 
piergiorgio

Di conseguenza: "No such file or directory".
 
Ah, ok... ora è chiaro.


 Ah, ok... ora è chiaro.
 
Tra l'altro, un'altra dimostrazione di quanto
sia "pericoloso" usare i glob.
 
bye,
 
-- 
 
piergiorgio


Ma basta aggirarla:
find <args> | xargs rm
 


grazie, eh! Mi stai dicendo che per non incappare nell'eventuale problema 
dell'espansione del glob si può anche evitare di usare il glob :) 
E non credo che io necessitavo di una spiegazione sull'uso xargs (o di 
eventuali altri metodi) e tantomeno tu avevi bisogno di dimostrare a 
qualcuno che eri al corrente di una simile "astuzia" .... per nulla 
esoterica. 
 
-- 
Massimiliano Adamo


Che problemi hai ?
Non mi metto di certo a fare litigi  sul perchè argv ha una size di 130K
Che comunque è un problema relativo perfettamente aggirabile le rare 
volte che serve.
Ma se per te questo è un problema cosi insormontabile da non dormirci la 
notte trova una soluzione diversa da quelle che ho proposto invece che 
inveire contro la mia persona.
 
 
 

 volte che serve. 
 
chiaro che è un problema perfettamente aggirabile le rare volte che serve. 
Basta non usare il glob ... come avevo detto in principio, prima che tu 
cominciassi a fare il professorino :) 
 
Adesso lo faccio io il professorino? :) Non si tratta di 'argv'. 
ARG_MAX secondo me contiene sia "ARGV", sia la stringa del comando. Per 
questo avevo notato una differenza tra "rm" e "touch". Con "rm" (che è una 
stringa più corta) riuscivo ad avere qualche carattere in più come "argv". 
 
Questo giusto perché tu avevi citato argv, e per dimostrarti che tutti 
possono fare i professorini pedanti :) 
 
-- 
Massimiliano Adamo


 
int main(int argc,char** argv) {
...
}
 
argv[0] contiene il puntatore al primo argomento che è sempre il nome 
del programma
la stringa degli argomenti e una variabile globale definita come char 
_ARGS[ARG_MAX] con \0 come separatore tra le stringhe e due \0 
consecutivi alla fine che è definita nella lib di startup del C (quella 
che poi chiama main)
PS: il nome _ARGS potrebbe essere diverso.
 
 
 
 
 

 Quando lo avevi scritto ?
 
nel preciso momento in cui ho detto che il glob era potenzialmente rischioso 
rendevo implicito il fatto che l'alternativa era quella di non usare il glob 
stesso. 
Non è un concetto filosofio. E' una banalità e citare "xargs" o "find -exec" 
francamente mi pare superfluo su questo gruppo, perché nessuno è nato ieri. 
 
hanno ragione su it.lavoro.informatica: ti piace cavillare su tutto ;) 


 
 
Ma figuriamoci
 

 Quando lo avevi scritto ?
 
L'ho scritto nel momento in cui ho iniziato la discussione, sostenendo che 
"rm *" poteva eventualmente causare questo problema. E' implicito che se 
il glob crea un problema, la soluzione è quella di non usarlo. 
E francamente mi sembra superfluo citare "find -exec" o "xargs", perché 
nessuno tra i presenti è nato ieri. 
 
guarda che hanno ragione su it.lavoro.informatica: stai sempre a 
cavillare :) 
 
-- 
Massimiliano Adamo

 Quando lo avevi scritto ?
 
nel preciso momento in cui ho detto che il glob era potenzialmente 
rischioso, rendevo implicito il fatto che l'alternativa era quella di non 
usare il glob stesso. 
Citare "xargs" o "find -exec" francamente mi pare superfluo su questo 
gruppo, perché nessuno è nato ieri. 
 
hanno ragione su it.lavoro.informatica: ti piace cavillare su tutto ;) 
 
 
-- 
Massimiliano Adamo