2010-08-24 16 views
0

J'ai souvent le scénario suivant: afin de reproduire un bug de reporting, je crée un petit exemple de projet, parfois un projet maven multi module. Il peut donc y avoir une hiérarchie de répertoires et il contiendra généralement quelques petits fichiers texte. La procédure standard serait bien sûr de créer un fichier zip et de l'envoyer. Mais sur certaines listes de diffusion, les pièces jointes ne sont pas autorisées, et donc je cherche un moyen de créer automatiquement un script d'installation, que je peux publier sur de telles listes de diffusion. Fondamentalement, je serais heureux avec un seul saveur Unix qui crée des instructions mkdir pour créer des répertoires et des instructions >> pour écrire le contenu du fichier. (En fait, en dehors des délimiteurs de chemin relatifs, les versions de Windows et d'Unix peuvent probablement être identiques)Solution pour générer par programmation un script d'exportation à partir d'une hiérarchie de répertoires

Un tel outil existe-t-il quelque part? Sinon, j'en écrirai probablement un en Java, mais je suis heureux d'accepter des solutions dans toutes sortes de langues.

(L'outil peut fonctionner sous Windows ou unix, mais la plate-forme cible pour les scripts générés doivent être soit unix ou configurable)

+0

J'ai mis à jour ma réponse pour répondre à vos objections. Est-ce que ma réponse couvre ce dont vous avez besoin, et si non, pourriez-vous clarifier comment? (Je n'ai pas essayé de rendre quelque chose de portable à Windows, car il semble que l'exécution sur Windows n'est pas une exigence). –

Répondre

1

Je pense que vous cherchez shar, ce qui crée une archive shell (shell script que lors de l'exécution produit une hiérarchie de répertoires donnée). Il est disponible sur la plupart des systèmes; vous pouvez utiliser GNU sharutils si vous ne l'avez pas déjà.

usage normal pour emballer un arbre de répertoire serait quelque chose comme:

shar `find somedirectory -print` > archive.sh 

Si vous utilisez sharutils GNU, et que vous souhaitez créer des archives « de vanille » qui utilisent uniquement le plus portable builtins shell, mkdir et sed, vous devez l'appeler shar -V. Vous pouvez retirer plus de bagages supplémentaires des scripts en utilisant -xQ; -x pour supprimer les vérifications des fichiers existants et -Q pour supprimer la sortie détaillée de l'archive.

shar -VxQ `find somedir -print` > archive.sh 

Si vous voulez vraiment quelque chose encore plus simple, voici une version de saleté simple shar comme un script shell. Il prend les noms de fichiers sur l'entrée standard au lieu d'arguments pour la simplicité et d'être un peu plus robuste.

#!/bin/sh 

while read filename 
do 
    if test -d $filename 
    then 
     echo "mkdir -p '$filename'" 
    else 
     echo "sed 's/^X//' <<EOF > '$filename'" 
     sed 's/^/X/' < "$filename" 
     echo 'EOF' 
    fi 
done 

invoquez comme:

find somedir -print | simpleshar > archive.sh 

Vous avez encore besoin d'invoquer sed, comme vous devez trouver un moyen de faire en sorte qu'aucune ligne dans le document ici commencer par le délimiteur, qui fermerait le document et la cause les lignes suivantes doivent être interprétées comme faisant partie du script. Je ne peux pas trouver de moyen vraiment efficace pour résoudre le problème de citation en utilisant seulement les builtins shell, donc vous devrez compter sur sed (qui est standard sur n'importe quel système de type Unix, et a été pratiquement toujours).

+0

Bien que ce soit agréable, il fait des hypothèses sur ce qui doit être installé sur le système cible. Je voudrais que le script puisse traiter ce qui est disponible sur chaque système standard d'une plate-forme donnée (avec une plate-forme aussi abstraite que: soit a) quelque chose avec un x [linux, bsd, macos etc] ou b) win2k) –

+0

Si vous utilisez GNU sharutils, vous pouvez utiliser 'shar -V' pour produire des archives shar" vanilla ", qui ne dépendent que des builtins shell de base,' mkdir', et 'sed'. Le shar que j'ai testé sur Mac OS X (le shar de FreeBSD) crée uniquement des fichiers vanilla shar. –

+0

sonne bien, je vais y jeter un coup d'oeil demain –

0

si votre problème sont des filtres non-fichier texte haïssant:

en temps oublié depuis longtemps, nous avons utilisé uuencode pour obtenir passé 8 bits relais alimentation - est qu'une façon d'obtenir attachement passé manger boîtes aux lettres ces jours-ci ? Alors, pourquoi pas le zip et uuencode? (ou base64, qui est son cousin plus jeune)

+0

Eh bien oui, c'est une solution au problème sous-jacent, merci. Mais ce n'est pas une réponse à ma question :-) –