Convertir tous les zip, rar et ace en tar.gz d'un coup

Bonjour à tous,

Je viens de finir d’écrire un petit script, et je tiens à le partager.

Donc en gros, c’est un script qui permet d’aller chercher toutes les archives présentes dans le répertoire utilisateur (récursivement) au format peu recommandé sous GNU/Linux (zip, rar et ace pour l’instant), et de les convertir proprement en archives de type tar.gz.

C’est pas un script très difficile à écrire pour les connaisseurs du shell, mais c’est quand même pas mal utile pour les jeunes loups qui viennent d’entrer dans le monde du libre, ça leur permet de ne pas garder les formats peu recommandés, et aussi d’être un peu plus dans la philosophie du libre, voyez ça comme vous voulez :smt002.

Par contre c’est un script écrit en csh, donc pour ceux n’ayant pas un shell csh en natif, la commande pour exécuter :

NB: Il gère aussi le taux de compression de gzip, donc il suffit de lui donner l’argument qui va bien, exemple :

Pour ce qui est des paquets requis :

  • unrar (et pas unrar-free qui est peut-être free, mais mauvais…)
  • unace (si pas de .ace à traiter, pas obligatoire)
  • unzip (même chose)

Voici le code :

[code]#!/bin/csh -f

requis : csh, unrar, unace, unzip

#--------free-arch-1.0--------#

###############################

Traitement des archives zip

###############################
foreach archives_zip ( ls *.zip )
mkdir dossiertempfarchive
mv $archives_zip dossiertempfarchive
cd dossiertempfarchive
unzip $archives_zip
rm $archives_zip
set prefixe = $archives_zip:r
set prefixetar = $prefixe.tar
tar cvf $prefixetar *
if ( $#argv == 1) then
if (
gzip $1 $prefixetar
else
gzip $prefixetar
endif
mv $prefixetar.gz …/
cd …/
rm -R dossiertempfarchive
end

###############################

Traitement des archives rar

###############################
foreach archives_rar ( ls *.rar )
mkdir dossiertempfarchive
mv $archives_rar dossiertempfarchive
cd dossiertempfarchive
unrar x -r $archives_rar
rm $archives_rar
set prefixe = $archives_rar:r
set prefixetar = $prefixe.tar
tar cvf $prefixetar *
if ( $#argv == 1) then
if (
gzip $1 $prefixetar
else
gzip $prefixetar
endif
mv $prefixetar.gz …/
cd …/
rm -R dossiertempfarchive
end

##########################################

Traitement des archives ace avec unace

##########################################
foreach archives_ace ( ls *.ace )
mkdir dossiertempfarchive
mv $archives_ace dossiertempfarchive
cd dossiertempfarchive
unace e x $archives_ace
rm $archives_ace
set prefixe = $archives_ace:r
set prefixetar = $prefixe.tar
tar cvf $prefixetar *
if ( $#argv == 1) then
if (
gzip $1 $prefixetar
else
gzip $prefixetar
endif
mv $prefixetar.gz …/
cd …/
rm -R dossiertempfarchive
end

set script = find ~ -name free-arch
foreach fichiers (ls * )
if ( -d $fichiers ) then
cd $fichiers
csh -f $script # —> Appels recursifs
cd …
endif
end[/code]

Voilà, c’est un script simple, mais que je ferais évoluer dès que j’aurais des idées.

N’hésitez pas à me faire part de toutes vos remarques/idées :smt002

Je connais pas csh mais ça m'a pas l'air très récursif...

Je connais pas csh mais ça m’a pas l’air très récursif…

Salut,

Non, c’est cette partie qui fait des appels récursifs :

foreach fichiers (` ls *` ) if ( -d $fichiers ) then cd $fichiers set script = `find ~ -name free-arch` csh -f $script # ---> Appels recursifs cd .. endif end

Ce que tu soulignes, c’est juste la boucle permettant de trouver toutes les archives .zip une à une.

Soit j’ai rien compris soit il y a un truc qui colle pas.

D’après ce que j’ai compris, free-arch est l’exécutable qui crée les archives.
Pourquoi tu le recherches x fois à partir d’un même répertoire (ton HOMEDIR),
ça va juste faire plein de find coûteux qui donneront le même résultat ?

Je te suggère d’utiliser pushd / popd à la place de cd / cd …,
ça te permettra d’imbriquer des changements de répertoire,
par exemple en appelant des fonctions qui changent le répertoire courant alors
que la fonction appelante l’avait déjà fait,
et ce pour des répertoires de n’importe quel niveau (pas juste des répertoires du répertoire courant).

[quote]D’après ce que j’ai compris, free-arch est l’exécutable qui crée les archives.
Pourquoi tu le recherches x fois à partir d’un même répertoire (ton HOMEDIR),
ça va juste faire plein de find coûteux qui donneront le même résultat ?[/quote]

Je suis d’accord, je pourrais aller le chercher dans le répertoire courant avec ~ simplement, mais si il n’y est pas ? si le script est dans un sous-dossier du répertoire courant ?

[quote]
Je te suggère d’utiliser pushd / popd à la place de cd / cd …,
ça te permettra d’imbriquer des changements de répertoire,
par exemple en appelant des fonctions qui changent le répertoire courant alors
que la fonction appelante l’avait déjà fait,
et ce pour des répertoires de n’importe quel niveau (pas juste des répertoires du répertoire courant).[/quote]

Huum, je ne connais pas ces fonctions, je me renseignerais. C’est vrai que je l’ai pas précisé mais pour moi le langage shell, c’est tout nouveau, surtout le csh.

~ n’est pas le répertoire courant mais le HOMEDIR. Le répertoire courant c’est ‘.’, $PWD ou le résultat de pwd si tu préfères.

find est fait pour chercher un motif dans le dossiers courant ET tous les sous-dossiers et leur sous-sous-dossiers… récursivement.

Bein pour moi aussi c’est nouveau. Nouveau et archaïque. Une fois que tu auras maîtrisé le CShell (pour ton UE je suppose) dépêche toi d’apprendre bash qu’on retrouve partout et pourquoi pas un petit coup d’œuil à ksh et zsh pour comparer.
Je pense qu’il est très important de bien maîtriser son shell le plus tôt possible, peut être même avant d’apprendre le C.

Oui c’est ce que je voulais dire.

Oui, ce que je voulais dire c’est que si le script n’est pas dans le répertoire home, je ne peux pas l’appeller par un simple ~/free-arch, du coup c’est pour ça que j’utilise find, pour le trouver dans toute l’arborescence, et l’exécuter.

[quote]Bein pour moi aussi c’est nouveau. Nouveau et archaïque. Une fois que tu auras maîtrisé le CShell (pour ton UE je suppose) dépêche toi d’apprendre bash qu’on retrouve partout et pourquoi pas un petit coup d’œuil à ksh et zsh pour comparer.
Je pense qu’il est très important de bien maîtriser son shell le plus tôt possible, peut être même avant d’apprendre le C.[/quote]

Ah je suis en première année licence info, et on apprend le cshell et le C en même temps (dans deux UE différentes).

Ah bah c’est bien, si tu postes ici c’est que tu es motivé pour ta licence :slightly_smiling:
Tu continues en info après ?

Bon sinon, fait moi plaisir, sors le "set script = find ~ -name free-arch" du foreach.
Et si tu as des questions en C, n’hésite pas :wink: .

[quote]Ah bah c’est bien, si tu postes ici c’est que tu es motivé pour ta licence :slightly_smiling:
Tu continues en info après ?[/quote]

Eh oui, mais l’année prochaine si je peux je ferais un BTS IG option développeur d’applications, parce-que je peine dans le reste des matières en licence.

Oui, en effet c’est beaucoup mieux comme ça. :laughing:

Merci !!