Création d'une archive tar sans inclure le directory parent lorsque les files sont stockés dans des directorys différents

J'ai les quatre files suivants dans le système de files:

/home/martin/cvs/ops/cisco/b/s1 /home/martin/cvs/ops/cisco/b/s2 /home/martin/cvs/ops/extreme/b/r3 /home/martin/cvs/ops/j/b/r5 

J'ai besoin de mettre ces files dans une archive tar, mais je ne veux pas append de directorys. Le meilleur que j'ai pu find était:

 tar -C ~/cvs/ops/ -czvf archive.tgz cisco/b/s1 cisco/b/s2 extreme/b/r3 j/b/r5 

Ce n'est pas encore parfait, car chaque file de l'archive a deux directorys profonds. Y a-t-il un meilleur moyen? Ou dois-je simplement copyr les files s1 , s2 , r3 et r5 dans un directory et créer l'archive avec tar -czvf archive.tgz s1 s2 r3 r5 ?

Vous pouvez utiliser -C plusieurs fois (déplacement d'un directory à un autre):

 tar czvf archive.tar.gz -C /home/martin/cvs/ops/cisco/b s1 s2 -C ../../extreme/b r3 -C ../../j/b r5 

Notez que chaque option -C est interprétée par rapport au directory actuel à ce point (ou vous pouvez simplement utiliser des paths absolus).

Si vous avez la list des files dans un file ou si vous pouvez les générer à l'aide d'une command, vous pouvez utiliser une seule command GNU tar:

 tar cf foo.tar -T list-of-files --transform 's:.*/::' 

La transformation conserve toujours les directorys, mais aplatit complètement la disposition. Donc, vous avez besoin d'un moyen de filterr les directorys, d'où la nécessité d'une list de files.

Vous pouvez append des files à l'archive un par un:

 tar cf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s1 tar rf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s2 tar rf /tmp/archive.tar -C /home/martin/cvs/ops/extreme/b r3 tar rf /tmp/archive.tar -C /home/martin/cvs/ops/j/b r5 

Vous pouvez créer un script pour le rendre plus simple: pour chaque path, exécutez tar rf avec le directory de base comme valeur du paramètre -C et le nom de file de base sans path à append.