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)
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? 😉
Chiedo venia… Non mi ero accorto che non vengono visualizzati correttamente i “backtick” (cioè gli apici al contrario). Ho inserito una correzione nell’articolo, ma vi invito su http://www.alessandropagano.net/wiki/index.php?n=Linux.DeleteTarGz per la corretta sintassi.
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
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. 😉
Articolo modificato, grazie mille per i suggerimenti…
anche un qualcosa di simile che è ancora + breve:
rm -fR $(tar -tf nomefile)
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.