2012-07-02 14 views
6

Tengo un montón de archivos xml en un directorio que necesita tener el comando dos2unix realizado en ellos y nuevos archivos se agregarán cada cierto tiempo. I En lugar de realizar manualmente el comando dos2unix en cada archivo cada vez, me gustaría automatizarlo con un script. Ni siquiera he mirado un script de shell en mi vida, pero hasta ahora tengo esto desde lo que he leído en algunos tutoriales:¿Cómo automatizar dos2unix usando el script de shell?

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

Sin embargo me siguen dando la salida 'uso' a aparecer. Creo que el problema es que no estoy asignando correctamente el nombre del nuevo archivo (fname). Alguien puede ayudar.

Gracias, Alan

Respuesta

6

El motivo por el que recibe un mensaje de uso es que dos2unix no toma los argumentos adicionales que está suministrando. Sin embargo, aceptará múltiples nombres de archivo (también a través de globs). No necesita un bucle a menos que esté procesando más archivos de los que se pueden aceptar en la línea de comando.

dos2unix /tmp/testFiles/*.xml 

debe ser todo lo que necesita, a menos que necesite la recursividad:

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

(para GNU encontrar)

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 

El resultado se guardarán en el subdirectorio converted/.

La construcción ${f/testFiles\//testFiles\/converted\/} (gracias a Rush) o sed se utiliza aquí para añadir converted/ antes del nombre del archivo:

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

Gracias, pero pueden explicar lo que esto hace: "$ (echo $ f | sed s @ testfiles/@ testfiles// convertido)" Editar: este comando no funciona. Error: sed: comando ilegible: s @ testFiles/@ testFiles/converted /, eliminar el comando sed da error: COuld no abrir el archivo de entrada ARCHIVOS –

+0

Acabo de agregar 'converted /' antes de ese nombre del archivo. –

+2

No necesita 'sed' para eso. Puede hacerlo con '$ {f/testFiles \ // testFiles \/converted \ /}' – rush

2

Si todos los archivos están en un directorio (sin recursividad es necesario) a continuación, ya casi estás ahí.

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

Por defecto dos2unix debe convertir en su lugar y sobrescribir el original.

Si se necesita la recursividad que tendrá que utilizar find así:

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

que trabajará en todos los archivos que terminan en .xml en /tmp/testFiles/ y todos sus subdirectorios.

Si se requiere ningún otro paso que puede saltar el lazo de la cáscara del todo:

no recursivo:

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

Y para recursiva:

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

En el mandato original veo usted encuentra el nombre base de cada nombre de archivo y trata de pasarlo al dos2unix, pero su intención no está clara. Más tarde, en un comentario, dices que solo quieres sobrescribir los archivos. Mi solución realiza la conversión, no crea copias de seguridad y sobrescribe el original con la versión convertida. Espero que esta sea tu intención.

+1

No está almacenando los resultados de un globo expandido. El globo no se expande en la asignación. –

+0

@DennisWilliamson: Veo que tienes razón. He eliminado este comentario, gracias por la corrección. – Sorpigal

0

No está claro qué implementación de dos2unix que está utilizando. Diferentes implementaciones requieren diferentes argumentos. Hay muchas implementaciones diferentes alrededor.

En RedHat/Fedora/Linux Suse Se puede teclear

dos2unix /tmp/testFiles/*.xml 

En SunOS que está obligado a dar un nombre de entrada y salida de archivo, y el comando anterior destruirías varios de sus archivos.

¿Qué versión estás usando?

cordiales, Erwin

Cuestiones relacionadas