Cancellare il contenuto di un tar.gz scompattato erroneamente

|

Quante volte abbiamo digitato il comando tar per estrarre un archivio, e ci siamo accorti di averlo fatto in una directory sbagliata?

E se magari la “directory sbagliata” fosse una con un centinaio di files? Non serve imprecare, e rimboccarsi le maniche per cancellare i files giusti, ma basta dare un semplice comando in “pipeline”.

tar tfx .tar.gz | rm -fr (backtick) awk ‘{print $1}’ (backtick)
(attenzione: quando inserisco “backtick” intendo l’apice al contrario)

Grazie alle segnalazioni di TA e malex (che trovate sotto, tra i commenti) correggo il comando con:

tar tf – | while read filename; do rm -rf “$filename”; done

oppure più rapidamente (se non ci sono spazi nei filename):

tar tf – | xargs rm -rf

 

Vediamo nel dettaglio cosa stiamo facendo.
Nella prima istruzione, il parametro “t” di tar indica di non estrarre realmente l’archivio ma solo di leggerne il contenuto; quest’ultimo verrà mandato in “pipe” al comando successivo che rimuoverà solo i files contenuti nell’archivio in questione.

Un piccolo Script che migliorare sensibilmente la vita di un utente, incorso in un errore di scompattazione.
Il seguente “articolo” è stato inserito anche nel wiki dove troverete la sintassi esatta (con la corretta visualizzazione dei backtick)

Precedente

Buone Feste!

Conky, un System Monitor davvero minimale

Successivo

Resta sempre aggiornato!

Elaborazione in corso...
Fatto! Sei nell'elenco.

7 commenti su “Cancellare il contenuto di un tar.gz scompattato erroneamente”

  1. Il comando che hai scritto contiene “qualche errore”: nel tar l’opzione “x” è in conflitto con la “t”; la sintassi della pipe è sbagliata, rm cerca di cancellare “awk…”.
    Vuoi ripensarci? 😉

    Rispondi
  2. C’è ancora qualche errore.
    1) tar tfx: t e x sono due opzioni incompatibili (e con alcuni tar, f dev’essere l’ultima opzione prima dell’archivio e tfx vorrebbe dire “leggi dal file x”). Il comando giusto è tar -tf file.tar.gz
    2) se il tar contiene molti file, il secondo comando va in errore perchè la dimensione degli argomenti di un comando è limitata dalla shell (“rm *” alle volte segnala “argument list too long”)
    3) awk ‘{ print $1 }’ è inutile: il tar scrive solo il nome del file in una riga e $1 quindi è la riga stessa; meno complicato sarebbe `cat`, ma
    4) per evitare problemi se nell’archivio ci sono filename contenenti spazi o caratteri speciali della shell il comando migliore è:

    tar tf – | while read filename; do rm -rf “$filename”; done

    e il più veloce (se non ci sono spazi nei filename):

    tar tf – | xargs rm -rf

    Rispondi
  3. Dispiace deluderti, ma non basta, devi togliere la “x” dalle opzioni del tar. E poi c’è un altro problema: con l’opzione “-r” di “rm”, cancelli le directory e il loro contenuto, indipendentemente dal fatto che siano presenti nell’archivio o meno. Non puoi neppure eliminare l’opzione “-r”, altrimenti non puoi cancellare le directory. 😉

    Rispondi
  4. marco,
    la tua soluzione potrebbe causare l’errore “argument list too long” segnalato da TA.
    Nessuno ha comunque risolto il problema di cancellare solo i file presenti nel tar, visto che l’opzione “-r” di “rm” cancella ricorsivamente il contenuto delle directory, anche se tale contenuto non è presente nel tar.

    Rispondi
it_ITItalian