Renombrar archivos usando C++ en GNU/Linux

By rtmex

En GNU/Linux (en los sistemas operativos tipo Unix en general, incluidos FreeBSD, etc.) no es recomendable manejar nombres de archivo que contengan espacios.

Puede darse el caso de que copiemos desde otro sistema operativo archivos que contienen espacios en su nombre, a nuestra máquina con GNU/Linux. Entónces, ¿qué hacer en esos casos?

Efectivamente… “lo recomendable” es renombrarlos para eliminar los espacios que contiene el nombre de archivo. Como puede ser una cantidad considerable de archivos, nos tomaría mucho tiempo ir renombrando archivo por archivo.

Exísten diferentes opciones para automatizar esa tarea, haciendo un script para bash, utilizando AWK y muchas otras soluciones.

A continuación un programa en C++ al que le podemos enviar una lista de directorios para que renombre todos los archivos que se encuentran en ellos eliminando los espacios del nombre de archivo.

/****************************************
 * Archivo: renombrar_archivos.cpp               
 * Autor  : SALOMON RINCON TORRES       
 * Fecha  : 08/05/2009 (dd/mm/yyyy)
 */

#include <iostream>
#include <string>
#include <sys/types.h>
#include <dirent.h>

using namespace std;

string QuitaEspacios(string s_cadena)
{
 string s_aux;

 for (int i_pos = 0; i_pos < s_cadena.length(); i_pos++)
     {
       if (s_cadena[i_pos] != ' ')
           s_aux += s_cadena[i_pos];
     }
 return s_aux;
}

int main (int argc, char *argv[])
{
 DIR *dirh;
 struct dirent *dirp;
 string s_dir, s_nombre, s_nuevonombre;
 int i_renombrados = 0, i_ok = 0, i_fallos = 0;

 for(int i = 1; i < argc; i++)
    {
     s_dir = argv[i];
     i_renombrados = 0;
     i_ok = 0;
     i_fallos = 0;

     cout << "******************** Directorio \"" << s_dir << "\" ********************\n" << endl;

     if ((dirh = opendir(s_dir.c_str())) == NULL)
         perror("No se pudo accesar al directorio ");
     else
        {
         for (dirp = readdir(dirh); dirp != NULL; dirp = readdir(dirh))
             {
              s_nombre = dirp->d_name;

              // Checamo que no sea el directorio . o ..
              if (s_nombre != "." && s_nombre != "..")
                 {
                  cout << "Archivo: " << s_nombre << endl;

                  // Si el nombre del archivo tiene un espacio, lo renombramos
                  if (s_nombre.find(" ") != string::npos)
                     {           
                      s_nuevonombre = QuitaEspacios(s_nombre);

                      if (rename((s_dir+"/"+dirp->d_name).c_str(), (s_dir+"/"+s_nuevonombre).c_str()) == 0)
                         {
                          i_renombrados++;
                          cout << "   === Renombrado como: " << s_nuevonombre.c_str() << endl;
                         }
                      else
                          {
                           i_fallos++;
                           perror("No se pudo renombrar");
                          }
                     } /* if */
                  else
                      {
                       i_ok++;
                       cout << "OK\n";
                      }
                 } /* if */
             } /* for */

         closedir(dirh);
         cout << endl;
         cout << "--- Archivos renombrados: " << i_renombrados << endl;
         cout << "--- Archivos OK: " << i_ok << endl;
         cout << "--- Archivos que no se pudieron renombrar: " << i_fallos << endl << endl;
        } /* else */
    } /* for */
 return 0;
}

Etiquetas: , , ,

Escribe un comentario