Tengo un pequeño problema. Un cliente me encargó la migración de sitios desde un servidor realmente antiguo. No sé cómo llegaron allí, pero hay archivos con '
sus nombres. ¿Hay alguna forma de cambiar el nombre del archivo? mv
no parece hacer el truco.
ls
lo muestra como 90843_O\\'ConnorPaul_GeneralManager.jpg
Cuando lo intento
mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
no hace nada con el >
en la nueva línea como si esperara más entrada.
Si lo intento
mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
Me sale el error
mv: no puede stat '90843_O \' ConnorPaul_GeneralManager.jpg ': No existe tal archivo o directorio
Además, ¿hay una manera simple de cambiar \'
a _
todos los archivos en cierta carpeta?
vidir
es una solución simple para este tipo de problemas.Respuestas:
La finalización de la pestaña Bash debería poder hacer lo correcto aquí si solo escribe
mv 90843_O
y presiona tab. De lo contrario, una forma de escapar correctamente del nombre es:Las comillas dobles eliminan la necesidad de escapar de la
'
, pero los dos caracteres de barra invertida aún deben escapar (una barra invertida adicional para cada uno genera cuatro barras invertidas). Otra opción es:Aquí, poner las barras diagonales inversas entre comillas simples elimina la necesidad de escapar de ellas, pero debe finalizar las comillas simples para agregar un literal
'
. Esto se escapa después del final de las comillas.Tenga en cuenta que el problema aquí tiene tanto que ver con tener barras invertidas en el nombre como la comilla simple. Para reemplazar la
\\'
secuencia (ya que hay dos barras invertidas en el nombre de archivo en la pregunta, ambas causarán problemas) con un guión bajo para todos los archivos en un directorio usando un bucle:El
-i
hará unmv
mensaje si se sobrescriben los archivos. Usandoprename
(rename
enlaces a esto en muchos sistemas):Elimina
-n
cuando estés feliz de que esté haciendo lo que quieres. Tenga en cuenta que los caracteres de barra diagonal inversa deben escaparse dentro de la expresión perl aquí, aunque haya comillas simples alrededor de ellos (sin las comillas simples, necesitaría ocho barras diagonales inversas ya que el shell eliminaría cuatro y no formaría parte de la expresión perl).fuente
Se puede utilizar
rename
para este tipo de tareas:Si desea reemplazar
'
por_
también puede usar cambiar nombre:fuente
Grrr, @Graeme me ganó, pero publicaré de todos modos ...
Si cita el nombre del archivo con comillas dobles, como
mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg
, hace el truco; el uso-v
es opcional pero dirá lo que hizo. Creo que también hay una segunda forma, aparte de escapar de todos los caracteres, si eso es posible. El único inconveniente que conozco de esta manera es que el shell procesará el texto, ya que no está entre comillas simples, pero no lo manipula en absoluto, ya que no es un código interno, y el tiempo extra que lleva procesar no tiene sentido.Recién probado, puede tener char like
>
dentro de un texto entre comillas dobles y se tomará como parte del nombre del archivo.Como un consejo para el futuro, puede usar
./
justo antes del nombre del archivo si le da problemas, como los archivos que comienzan con un guión:mv ./-file file
cambiarán el nombre-file
afile
. En este caso, no puede citar ni escapar del nombre de archivo, como excepción.Por extraño que parezca, podría crear el archivo
90843_O'ConnorPaul_GeneralManager.jpg
si escapara de la comilla simple\'
, pero no lo crearía si no fuera entre comillas dobles o escapó.PD: La finalización de Bash es otra forma, solucionó el problema del nombre de archivo con su archivo, pero no funcionará con los archivos / carpetas "guión": simplemente escriba una parte del nombre y presione Tab, hace el resto.
fuente