2012-07-02 5 views
6

J'ai un tas de fichiers xml dans un répertoire pour lequel la commande dos2unix doit être exécutée et de nouveaux fichiers seront ajoutés de temps en temps. I Au lieu d'exécuter manuellement la commande dos2unix sur chaque fichier chaque fois que je voudrais automatiser tout cela avec un script. Je l'ai même jamais regardé un script shell dans ma vie, mais jusqu'à présent je ce de ce que j'ai lu sur quelques tutoriels:Comment automatiser dos2unix en utilisant un script shell?

FILES=/tmp/testFiles/* 
for f in $FILES 
do 
    fname=`basename $f` 
    dos2unix *.xml $f $fname 
done 

Cependant, je continue à obtenir la sortie « d'utilisation » montrant. Je pense que le problème est que je n'attribue pas correctement le nom du nouveau fichier (fname). Quelqu'un peut-il aider.

Merci, Alan

Répondre

6

La raison pour laquelle vous obtenez un message d'utilisation est que dos2unix ne prend pas les arguments supplémentaires que vous fournissez. Il acceptera cependant plusieurs noms de fichiers (également via globs). Vous n'avez pas besoin d'une boucle sauf si vous traitez plus de fichiers que ce qui peut être accepté sur la ligne de commande.

dos2unix /tmp/testFiles/*.xml 

devrait être tout ce dont vous avez besoin, à moins que vous avez besoin récursion:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

(pour GNU trouver)

1
mkdir /tmp/testFiles/converted/ 
for f in /tmp/testFiles/*.xml 
do 
    fname=`basename $f` 
    dos2unix $f ${f/testFiles\//testFiles\/converted\/} 
    # or for pure sh: 
    # dos2unix $f $(echo $f | sed [email protected]/@testFiles/converted/@) 
done 

Le résultat sera enregistré dans le sous-répertoire converted/.

La construction ${f/testFiles\//testFiles\/converted\/} (grâce à Rush) ou sed est utilisé ici pour ajouter converted/ avant le nom du fichier:

$ echo /tmp/testFiles/1.xml | sed [email protected]/@testFiles/converted/@ 
/tmp/testFiles/converted/1.xml 
+0

Merci, mais pouvez-vous expliquer ce que cela fait: "$ (echo $ f | sed s @ TestFiles/@ TestFiles/converti /)" Edit: cette commande ne fonctionne pas. Erreur: sed: commande brouillée: s @ testFiles/@ testFiles/converted /, supprimer la commande sed donne une erreur: COuld ne pas ouvrir le fichier d'entrée FICHIERS –

+0

Je viens d'ajouter 'converti /' avant ce nom du fichier. –

+2

Vous n'avez pas besoin de 'sed 'pour cela. Vous pouvez le faire avec '$ {f/testFiles \ // testFiles \/converti \ /}' – rush

2

Si tous les fichiers sont dans un répertoire (pas récursion nécessaire), puis tu y es presque.

for file in /tmp/testFiles/*.xml ; do 
    dos2unix "$file" 
done 

Par défaut dos2unix devrait convertir en place et remplacer l'original.

Si récursion est nécessaire, vous devrez utiliser find ainsi:

find /tmp/testFiles -name '*.xml' -print0 | while IFS= read -d '' file ; do 
    dos2unix "$file" 
done 

qui fonctionne sur tous les fichiers se terminant par .xml dans /tmp/testFiles/ et tous ses sous-répertoires.

Si aucune autre étape est nécessaire, vous pouvez sauter la boucle shell entièrement:

non récursif:

find /tmp/testFiles -maxdepth 1 -name '*.xml' -exec dos2unix {} + 

Et pour récursive:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

Dans votre commande originale que je vois vous trouvez le nom de base de chaque nom de fichier et essayez de le passer à dos2unix, mais votre intention n'est pas claire. Plus tard, dans un commentaire, vous dites que vous voulez juste écraser les fichiers. Ma solution effectue la conversion, ne crée aucune sauvegarde et remplace l'original par la version convertie. J'espère que c'était votre intention.

+1

Il ne stocke pas les résultats d'un glob étendu. Le glob n'est pas développé sur l'affectation. –

+0

@DennisWilliamson: Je vois que vous avez raison. J'ai enlevé ce commentaire, merci pour la correction. – Sorpigal

0

Il ne sait pas que la mise en œuvre de dos2unix que vous utilisez. Différentes implémentations nécessitent des arguments différents. Il existe de nombreuses implémentations différentes.

Sur RedHat/Fedora/Suse Linux, vous pouvez simplement taper

dos2unix /tmp/testFiles/*.xml 

SunOS vous devez donner une entrée et le nom du fichier de sortie et la commande ci-dessus détruire plusieurs de vos fichiers.

Quelle version utilisez-vous?

salutations, Erwin

Questions connexes