Compressions bzip2

Bonjour, j’ai encore besoin d’aide…

J’ai plusieurs dossier, avec plusieurs fichier dedans.

J’ai, par exemple un dossier appeler x, et dedans des fichiers appeler a , z , e , r …

Je souhaite tout compresser en bz2, mais chacun dans une archive differente. par ex:

a
a.bz2
z
z.bz2 etc…

Est-ce possible?

Je ne sais pas si c’est possible directement avec les options de bzip2,
mais tu peux toujours écrire un script.

Qqch comme…

for fic in * do bzip2 $fic ...(options) done

Le problème, c’est que le [mono]*[/mono] incluera aussi les fichiers .bz2 s’ils sont situés dans le même répertoire.

L’autre solution c’est de tester l’extension du fichier, et si c’est .bz2, ne pas compresser.
Ou mieux, cibler dans la boucle for si c’est possible, avec: *.bsp

Ce qui donnerai

[code]#!/bin/bash

for fic in *
do
bzip2 $fic
done[/code]
? ou c’est faux?

J’ai oublié de preciser, il faut garder les originaux aussi

for fic in $(ls | grep -v '\.bz2$') ; do
    bzip2 --keep $fic
done

« .bz2$ » est une expression régulière indiquant : finit par « .bz2 »
L’expression entre $() sera exécuté et remplacé par le résultat dans la commande finale, donc la boucle for traitera ainsi tous les fichiers qui ne finissent pas par .bz2.
L’option --keep permet de conserver les originaux (d’après man bzip2).

Merci kna
Comment puis faire pour que sa s’applique aussi dans les elements dans les sous dossiers?

  1. Proprement, tu fais du récursif, ce qui n’est pas évident.
  2. Tu t’arranges pour faire sans, en imbriquant dans une autre boucle for

Note: [mono]-d[/mono] dans un [mono]test[/mono] permet de tester si le fichier est un répertoire. Voir: [mono]man test[/mono]

Ce que tu demandes nécessite d’apprendre à programmer en shell, ce qui n’est pas aussi simple qu’enchaîner quelques commandes…

Pour du récursif, le plus simple est d’utiliser find : linux-france.org/article/memo/node126.html

Je te laisse chercher comment exclure les bz2. Pour apprendre les scripts shell, il n’y a pas de secret : il faut en bouffer… Si tu bloques, reviens nous voir.

J’ai reussis

for fic in $(ls |find . -not -name "*.bz2" |  grep -v '\.bz2$') ; do
    bzip2  --keep $fic
done

Effectivement, find, ça simplifie le problème…

Puisque tu as déjà exclu les .bz2 depuis find, tu n’es plus obligé de les re-filtrer avec grep

for fic in $(ls |find . -not -name "*.bz2") ; do bzip2 --keep $fic done

Encore mieux :

find . ! -name "*.bz2" -a ! -name ".*" -type f -exec bzip2 --keep {} \;

La commande find est très puissante 8)

(récupérer le résultat d’une commande comme [mono]ls[/mono], dans une variable, est très déconseillé)

par contre le bz2 c’est lent :118