Je viens de décompresser une archive qui a produit un désordre de fichiers dans mon répertoire bien rangé. Par exemple:
user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Je m'attendais à ce que le fichier tar ait été organisé dans un seul dossier (c'est-à-dire myarchive/
), mais ce n'était pas le cas! Maintenant, j'ai quelque 190 fichiers et répertoires qui ont fait un abattage numérique dans ce qui était un répertoire organisé. Ces fichiers non tarés doivent être nettoyés.
Existe-t-il un moyen de «défaire» cela et de supprimer les fichiers et répertoires extraits de cette archive?
Merci pour les excellentes réponses ci-dessous. En résumé , voici ce qui fonctionne avec deux étapes (1) supprimer des fichiers et (2) supprimer une structure de répertoire vide dans l'ordre de conditionnement inverse (pour supprimer d'abord les répertoires externes):
tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
Et encore plus sûr, pour prévisualiser une exécution à sec des commandes en ajoutant echo
après xargs
.
xargs
(tac
au lieu desort -r
simplement des cosmétiques), mais vous acceptez la réponse avec une substitution de processus qui, comme vous l'avez expliqué dans les commentaires, ne vous convenait pas? Veuillez également indiquer lexargs -d'\n'
commutateur dans votre message si vous souhaitez résumer pour les futurs utilisateurs, afin qu'ils ne soient pas mordus par des espaces dans les noms de fichiers.-d'\n'
jusqu'à présent, et après une analyse plus approfondie, votre réponse est en fait plus proche de ce que j'ai utilisé.-d'\n'
réside dans le fait que si vous ne dites pasxargs
de diviser les arguments sur de nouvelles lignes (ce que vous nourrissez) mais sur des espaces, alors un fichier avec le le nomfolder1/some file
sera lu commefolder1/some
etname
.Réponses:
listera le contenu ligne par ligne.
Cela peut être
xargs
directement canalisé , mais attention : faites la suppression très soigneusement. Vous ne voulez pas simplementrm -r
tout ce quitar tf
vous dit, car il peut inclure des répertoires qui n'étaient pas vides avant le déballage!Vous pourriez faire
pour supprimer d'abord tous les fichiers qui étaient dans l'archive, puis les répertoires laissés vides.
sort -r
(glennjackman a suggérétac
au lieu desort -r
dans les commentaires de la réponse acceptée, qui fonctionne également cartar
la sortie de est suffisamment régulière) est nécessaire pour supprimer les répertoires les plus profonds en premier; sinon, un cas oùdir1
contient un seul répertoire videdir2
quitteradir1
après larmdir
passe, car il n'était pas vide avant d'dir2
être supprimé.Cela va générer beaucoup de
et
Fermez-le
2>/dev/null
si cela vous ennuie, mais je préférerais garder autant d'informations que possible sur le processus.Et ne le faites pas tant que vous n'êtes pas sûr de trouver les bons fichiers. Et peut-être essayez
rm -i
de tout confirmer. Et avoir des sauvegardes, manger votre petit déjeuner, vous brosser les dents, etc.la source
-d'\n'
option àxargs
.xargs
n'a pas-d
, donc vous avez besoin de la variante GNU si vous êtes une pauvre âme comme moi.Listez le contenu du fichier tar comme suit:
Ensuite, supprimez ces noms de fichiers en itérant sur cette liste:
Cela reste juste la liste des fichiers qui seraient supprimés. Remplacez
echo
parrm
si vous êtes vraiment sûr que ce sont ceux que vous souhaitez supprimer. Et peut-être faire une sauvegarde pour être sûr.Dans un deuxième passage, supprimez les répertoires qui restent:
Cela empêche la suppression des répertoires avec s'ils existaient déjà auparavant.
Une autre astuce intéressante de @glennjackman, qui préserve l'ordre des fichiers, en commençant par les plus profonds. Encore une fois, retirez
echo
lorsque vous avez terminé.Cela pourrait ensuite être suivi par le
rmdir
nettoyage normal .la source
while
pour boucler sur un ensemble d'enregistrements. Je viens de m'y habituer. @ stérm -rf
pouvait supprimer des fichiers qui n'étaient pas de l'archive mais à l'intérieur d'un répertoire portant le même nom que celui de l'archive. Mieux vaut être prudent ici et utiliserrmdir
dans un deuxième passage.rmdir
doit être exécutée pour chaque niveau d'imbrication des répertoires. Donc, il sera nettoyésubdir1
lors de la première passe, mais quittedir1
car il a essayé de supprimer ce premier alors qu'il n'était pas vide à l'époque. Cette commande peut être exécutée une fois si la liste des fichiers peut être triée en sens inverse.tar tvf arch.tar | tac | xargs echo rm
(supprimez l'écho lorsque vous êtes sûr)Voici une possibilité qui prendra les fichiers extraits et les déplacera dans un sous-répertoire, nettoyant votre dossier principal.
Enregistrez-le dans le fichier
fix-tar.pl
, puis exécutez-le comme ceci:Cela confirmera que votre
tar
liste est comme la mienne. Vous devriez obtenir une sortie comme:Si cela semble bon, exécutez-le à nouveau comme ceci:
Le
fixup.sh
script sera les commandes shell qui déplaceront les fichiers et répertoires de niveau supérieur dans un dossier "propre" (dans ce cas, le dossier appelécleanup
). Jetez un œil à travers ce script pour confirmer que tout est casher. Si c'est le cas, vous pouvez maintenant nettoyer votre gâchis avec:Je préfère ce type de nettoyage car il ne détruit rien qui ne soit déjà détruit en étant écrasé par cette initiale
tar xv
.Remarque: si cette sortie initiale de fonctionnement à sec ne semble pas correcte, vous devriez pouvoir jouer avec les chiffres des deux
substr
appels de fonction jusqu'à ce qu'ils semblent corrects. La$perms
variable n'est utilisée que pour la marche à sec, donc seule la$dirent
sous - chaîne doit être correcte.Une autre chose: vous devrez peut-être utiliser l'
tar
option--numeric-owner
si les noms d'utilisateur et / ou les noms de groupe dans latar
liste font que les noms commencent dans une colonne imprévisible.la source
Ce type d'archives (antisociales) s'appelle une bombe tar à cause de ce qu'elle fait. Une fois que l'une de ces "explosions" sur vous, les solutions dans les autres réponses sont bien meilleures que ce que j'aurais suggéré.
Cependant, la meilleure "solution" consiste à éviter le problème en premier lieu.
La façon la plus simple (la plus paresseuse) de le faire est de toujours décompresser une archive tar dans un répertoire vide. S'il comprend un répertoire de niveau supérieur, il vous suffit de le déplacer vers la destination souhaitée. Sinon, renommez simplement votre répertoire de travail (celui qui était vide) et déplacez-le à l'emplacement souhaité.
Si vous voulez juste faire les choses correctement la première fois, vous pouvez exécuter tar -tvf archive-file.tar | moins et il listera le contenu de l'archive afin que vous puissiez voir comment il est structuré et ensuite faire ce qui est nécessaire pour l'extraire à l'emplacement souhaité pour commencer.
L'option t est également utile si vous souhaitez inspecter le contenu d'une archive juste pour voir si elle contient quelque chose que vous recherchez. Si tel est le cas, vous pouvez éventuellement extraire le ou les fichiers souhaités.
la source