¿Necesita buscar recursivamente todos los nombres de archivos que contengan dos puntos y reemplazarlos con un guión?

¿Necesita buscar recursivamente todos los nombres de archivos que contengan dos puntos y reemplazarlos con un guión?

Tengo un directorio 'principal' que contiene muchos subdirectorios y en algunos de estos subdirectorios tengo nombres de archivos que contienen dos puntos. Subí el directorio 'principal' a un repositorio de GitHub desde Linux, pero tuve un problema cuando intenté extraerlo de este repositorio en una máquina con Windows, ya que Windows no permite dos puntos en los nombres de archivos.

¿Cómo puedo encontrar recursivamente todos los nombres de archivos con dos puntos en el directorio 'principal' usando la terminal de Linux y luego reemplazar los dos puntos con, digamos, un carácter de guión (-)?

Respuesta1

find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +

(Si este comando no funciona para usted, consulte la Nota de compatibilidad al final de esta respuesta).

Esta es una versión básica segura que sólo imprime lo que sucedería. Para que esto suceda, deshazte de -nla opción.

Funcionaría sin él, -name "*:*"pero es bueno dejar findpasar solo los nombres de archivos que deben cambiarse porque esto hace que todo el comando sea más rápido.

Funciona así:

  • findencuentra...
    • ...en la /path/to/directorysuciedad...
    • ...todos los archivos ( -type f)...
    • ...con nombres coincidentes ( -name "*:*"),...
    • ...luego se ejecuta rename(varias veces si es necesario)...
    • ...con el patrón a sustituir :por -...
    • ...en todos los archivos encontrados, varios archivos a la vez ( {} +).

Notas:

  • El comando no cambia el nombre de los directorios y esto es por diseño.
  • Es posible que el cambio de nombre no funcione con algunos caracteres inusuales en el nombre del archivo (por ejemplo, nueva línea). Seguramente no tiene esos nombres de archivo allí, por lo que esto es más bien una nota formal.

Nota de compatibilidad

La solución utiliza un script Perl renamedel renamepaquete disponible en Debian, Ubuntu. Otras distribuciones pueden tener renamedesde util-linux.

este manualsugiere que la solución para no Perl renamedebería ser:

find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +

(Nuevamente, elimínelo -nsi se ve bien). Sin embargo, no lo he probado. Creo que reemplazará solo los primeros dos puntos en un nombre de archivo. Una solución alternativa es repetir el comando (sin -n, con -v) hasta que no queden dos puntos.

Alternativamente, puede obtener el script Perl de un archivo disponible eneste sitio(Actualmente File-Rename-0.20.tar.gz, el script se llama rename.PL). Ver tambiénesta pregunta.

información relacionada