2011-10-07 7 views
5

He intentado escribir un script que tomará el directorio de trabajo actual, analizará todos los archivos y comprobará si se trata de un archivo .txt. Luego tome cada archivo (que es un archivo de texto), y verifique si contiene un guión bajo en su nombre y si lo hace para cambiar el guión bajo a guión.Cambiar el nombre de los archivos en un directorio UNIX - shell scripting

Sé que esta es una tarea difícil, pero aquí está el código en bruto que tengo hasta ahora:

#!/bin/bash 
count=1 
while((count <= $#)) 
     do 
      case $count in 
       "*.txt") sed 's/_/-' $count 
      esac 
      ((count++)) 
done 

lo que estaba pensando es que esto llevaría a los archivos en el directorio de trabajo actual como los argumentos y verifique cada archivo (representado por $ count o el archivo en "count"). Luego, para cada archivo, verificaría si terminara en .txt y si lo hiciera cambiaría cada guión bajo a un guión usando sed. Creo que uno de los principales problemas que tengo es que el script no lee los archivos del directorio de trabajo actual. Intenté incluir el directorio después del comando para ejecutar el script, pero creo que tomó cada línea en lugar de cada archivo (ya que hay 4 o más archivos en cada línea).

De todos modos, cualquier ayuda sería muy apreciada! Además, lamento que mi código sea tan malo, soy muy nuevo en UNIX.

+0

Un problema es que '$ count' es el valor de la variable' count', que es un entero. Si desea iterar sobre los parámetros posicionales, debe escribir: 'para el archivo en" $ @ "; do ... 'o la abreviatura' para el archivo; do ... ' –

+0

compruebe aquí: http: //theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html – Vijay

Respuesta

0
 
$ ls *.txt | while read -r file; do echo $file | 
    grep > /dev/null _ && mv $file $(echo $file | tr _ -); done 

(no probado)

+0

Esto fallará en los archivos que contienen espacios en el nombre del archivo. Incluso puede perder algunos datos si hace 'mv' incorrecto. –

+0

Sí, fallará en los archivos que contienen espacios. Las personas que ponen espacios en sus nombres de archivo merecen perder todos sus datos. :) –

+0

Estoy de acuerdo ... :-) Sin embargo, estamos aquí para aprender unos de otros y es por eso que agregué este comentario. Saludos. –

1
por qué no

:

rename 's/_/-/' *.txt 
+0

'rename: comando no encontrado'. La pregunta es acerca de Unix, no una distribución particular de Linux. Pero dado que Perl está instalado en casi todas partes, es una solución agradable y flexible. –

+2

@RolandIllig: Sé que 'rename' no está en todas partes, pero desde shebang supuse que se ejecuta en algún sistema moderno tipo Unix. –

2
for fname in ./*_*.txt; do 
    new_fname=$(printf '%s' "$fname" | sed 's,_,-,') 
    mv "$fname" "$new_fname" 
done 
+2

Si el shell es bash, uno puede escribir: 'new_fname = $ {fname // _/-}' –

0

Gracias por todos sus tipos de entrada! Con todo, creo que la solución que encontré fue el más apropiado para mi nivel de habilidad era:

ls *.txt | while read -r file; do echo file | 
    mv $file $(echo $file | sed 's,_,-,'); 
done 

esto que lo que necesitaba hacer, y para mis propósitos no estoy demasiado preocupado por los espacios. Pero gracias por todas sus maravillosas sugerencias, ¡todos son muy inteligentes!

Cuestiones relacionadas