[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: OT (ma forse no) bash cancellazione ricorsiva di files e cartelle ma solo da un certo livello in poi.



Ciao Davide,

Ti ringrazio per avermi fatto riflettere sulla possibilità che alcune
versioni di *nix possano fare qualche limitato danno con la riga che avevo
proposto.

L'obiettivo iniziale era cancellare ogni file e dir contenuto nelle
directory contenute in /scambio/, senza cancellare queste ultime.
Il mio suggerimento a questo punto è:

$ rm -rf /scambio/*/* /scambio/*/.[^.]*

che, come hai consigliato, evita /scambio/*/. e /scambio/*/..


Ciò detto, mi permetto di non esser d'accordo col resto che scrivi e ti
rispondo nel seguito.


Il Mer, 24 Ottobre 2012 6:43 pm, Davide Prina ha scritto:
> perché io sapevo che le regole era queste: rm cancella tutti i file
> tranne quelli inizianti per ., per cancellare quelli dovevi indicare il

Spiace doverti contraddire, ma non è mai stato così. rm non cancella
"tutti i file", ma esattamente quelli che vengono specificati nei
parametri.

Non confondere il comportamento del comando "rm" con la sostituzione che
la shell fa dei caratteri jolly (come "*").

Se digiti "rm *", il comando rm non "vede" l'asterisco, ma una lista di
parametri che la shell espande _prima_ di lanciare il comando. Stessa cosa
per "rm .*", dal punto di vista di rm non c'è alcuna differenza
sostanziale, se non per il fatto che la lista di parametri ovviamente
cambia.

Per stupirsi di come "*" funzioni e meditare un po' in proposito, ti
propongo di provare a digitare in una shell le righe seguenti:

mkdir -p /tmp/provashell/z;cd /tmp/provashell #Per metterci al sicuro.
touch z/uno z/due ls .a #Creiamo qualche file...
* #Esattamente un asterisco senza altro e poi invio
mv ls rmdir #Cambiamo nome ad un file e
* #di nuovo lo stesso asterisco... con risultati diversi
echo * #Un paio di echo per capire cosa succede
echo .* #mettendo o no un punto
* .* #Qualche bizzarria
echo * .* #per finire

Si può consigliare in proposito la lettura del manuale della shell, il
paragrafo interessante dovrebbe chiamarsi "Pathname Expansion", anche se
non sempre è molto chiaro...

> . come primo carattere del file passato a rm. Se poi passavi rm -rf .*,
> allora cancellava tutti i file, compresi quelli speciali in modo

rm -rf cancella in modo ricorsivo (r) e senza chiedere conferme (f),
comprese directory. Il fatto che i parametri che riceve come nomi da
cancellare abbiano o meno dei punti non cambia nulla nel suo
comportamento.

> quanto ho detto è vero, come dicono gli appunti di informatica libera,

Mi spiace dover smentire anche una fonte cosi' simpatica, ma non è vero e
non lo è mai stato. Certamente il fatto che l'autore degli appunti abbia
preso qualche abbaglio non diminuisce il valore del suo alacre lavoro.
Sono propenso ad immaginare che, semplicemente, non abbia mai provato.

Senza entrare nelle pieghe del comportamento della shell, basta
un'analogia per capirlo.

Cosa fa "rm -rf a*"? Cancella, dalla dir corrente, file e le directory il
cui nome inizia per "a", compreso il contenuto di queste ultime senza
badare alle iniziali dei nomi, punti inclusi.

Perché mai "rm -rf .*" dovrebbe comportarsi in modo diverso? Gli autori
di Unix avrebbero previsto un'apposita eccezione? Per rendere il comando
più pericoloso?!?
Che si rischi di cancellare .. è possibile, ma di certo non succede che
la ricorsione "cambi direzione" cancellando anche ../.. , ../../.. e via
di seguito. Non è mai successo, in nessuna versione di *nix. Con buona
pace della teoria degli appunti.

Come premesso, "rm -rf .[^.]*" dovrebbe fugare ogni dubbio.

Fammi sapere che ne pensi!
m

-- 
http://bodrato.it/software/strassen.html


Reply to: