Cambiar el nombre del archivo que recibió una comilla 'en su nombre

11

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? mvno 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?

Igor Yavych
fuente
1
Si tiene más usos , vidires una solución simple para este tipo de problemas.
derobert

Respuestas:

6

La finalización de la pestaña Bash debería poder hacer lo correcto aquí si solo escribe mv 90843_Oy presiona tab. De lo contrario, una forma de escapar correctamente del nombre es:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

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:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

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:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

El -ihará un mvmensaje si se sobrescriben los archivos. Usando prename( renameenlaces a esto en muchos sistemas):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Elimina -ncuando 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).

Graeme
fuente
4

Se puede utilizar renamepara este tipo de tareas:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Si desea reemplazar 'por _también puede usar cambiar nombre:

rename "s/\'/_/g" *
Braiam
fuente
-2

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 -ves 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 filecambiarán el nombre -filea file. 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.jpgsi 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.

rautamiekka
fuente
¿Por qué downvote? Estaba escribiendo antes que los demás, pero no fui lo suficientemente rápido como para publicarlo primero.
rautamiekka
No fui yo. No tengo idea de quién votó abajo.
Igor Yavych
1
Esta respuesta no es correcta, ignora las barras diagonales inversas en el nombre del archivo, que en realidad son más difíciles de tratar que la comilla simple.
Graeme