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 -n
la opción.
Funcionaría sin él, -name "*:*"
pero es bueno dejar find
pasar solo los nombres de archivos que deben cambiarse porque esto hace que todo el comando sea más rápido.
Funciona así:
find
encuentra...- ...en la
/path/to/directory
suciedad... - ...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 (
{} +
).
- ...en la
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 rename
del rename
paquete disponible en Debian, Ubuntu. Otras distribuciones pueden tener rename
desde util-linux
.
este manualsugiere que la solución para no Perl rename
debería ser:
find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +
(Nuevamente, elimínelo -n
si 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.