
Ok, estoyrespondiendo una preguntadonde el OP tiene varios repositorios en Ubuntu que podrían estar causando problemas al instalar software no relacionado. Recomiendo desactivar los PPA usando un solo revestimiento rename
y luego seguir una serie de instrucciones. Todo bien, y simplemente dejo esa pregunta como respondida... no. Resultados que rename
no se comportaron como esperaba:
sudo rename s/list/list\.disable/g /etc/apt/sources.list.d/*.list
Con esto, espero que cambiar el nombre busque /etc/apt/sources.list.d/
cualquier archivo que termine en .list
y reemplace .list
con .list.disable
. Tuve otra respuesta con casi el mismo comando, pero OP nunca dio comentarios, y estoy tirando la teoría sin probarla primero. Entonces, para mi sorpresa, OP encuentra problemas con la línea:
Can't rename /etc/apt/sources.list.d/iaz-battery-status-quantal.list /etc/apt/sources.list.disable.d/iaz-battery-status-quantal.list.disable: No such file or directory
Can't rename /etc/apt/sources.list.d/ubuntu-wine-ppa-quantal.list /etc/apt/sources.list.disable.d/ubuntu-wine-ppa-quantal.list.disable: No such file or directory
Can't rename /etc/apt/sources.list.d/webupd8team-java-raring.list /etc/apt/sources.list.disable.d/webupd8team-java-raring.list.disable: No such file or directory
Tengo una sensación extraña, así que pruebo la teoría yo mismo y veo el mismo resultado. Entonces,cada vez que tienes un problema normalmente es una expresión regular, no? Cambié la expresión regular de muchas maneras retorcidas:
- s/.list/.list.disable/g
- s/.list/.list.disable/g
- /lista/lista.disable/
- otras combinaciones que no recuerdo
Bueno, decidí que la expresión regular no era el problema, así que miré el selector, lo cambio /etc/apt/sources.list.d/*
y reciclo la prueba de expresión regular. Sin alegría. Frustrándome un poco, lo hago touch some.list
y aplico mi comando.
rename s/\.list/\.list\.disable/g *
¡Bingo! Ahora me siento troleado por todas partes. Corrijo mi respuesta y sigo con mi vida... ¡no! Esto no es aceptable. ¿Por qué? Busco el manual que, para mi sorpresa, utiliza sólo ejemplos de rutas actuales. ¿Esto es normal? ¿O es simplemente que la función no se implementó? ¿O debería empezar a desconfiar de mis teorías?
Respuesta1
Utilice el -n
parámetro para ejecutar rename
en modo de prueba, lo que resulta muy útil cuando desea probar su patrón:
martin@martin ~ % rename -n s/list/list.disable/g /etc/apt/sources.list.d/*.list | sed 's/renamed as/\n =>/g'
[...]
/etc/apt/sources.list.d/spotify.list
=> /etc/apt/sources.list.disable.d/spotify.list.disable
/etc/apt/sources.list.d/steam.list
=> /etc/apt/sources.list.disable.d/steam.list.disable
[...]
El error obvio aquí es que el patrón list
coincide , por lo que estás intentando cambiar el nombre tanto de la carpeta como de los archivos que contiene.sources.list.d
Utilice este patrón en su lugar:
rename -n 's/\.list$/.list.disable/' /etc/apt/sources.list.d/*.list | sed 's/renamed as/\n =>/g'
[...]
/etc/apt/sources.list.d/spotify.list
=> /etc/apt/sources.list.d/spotify.list.disable
/etc/apt/sources.list.d/steam.list
=> /etc/apt/sources.list.d/steam.list.disable
[...]
Las diferencias son:
Citar
.
en el patrón de búsqueda\.
garantiza que el punto solo coincida con un punto real, y no con ningún carácter (eso es lo que suele hacer un punto sin comillas en una expresión regular).La
$
lista posterior significa "fin de cadena". Garantiza que solo el ".list" al final del nombre de archivo coincida y sea reemplazado, no un ".list" que se encuentre en otro lugar de la ruta o del nombre de archivo.No es necesario citar el punto en la cadena de reemplazo; Por lo tanto, ".list.disable" funciona sin barras invertidas, porque
.
ya no tiene un significado especial allí.También tenga en cuenta que he citado la expresión regular entre comillas simples para evitar que el shell la modifique de alguna manera.
Respuesta2
El problema es usar el interruptor global g
cuando en realidad deberías haber anclado el patrón. Tal como lo has escrito:
s/a/b/g
reemplaza cada a con b en todas partes de la cadena. Esto hace que intente cambiar el nombre a rutas para las que no existe ningún directorio. Esta es también la razón por la que el problema desapareció cuando realizó la operación dentro del directorio, por lo que solo había una coincidencia para sustituir.
Creo que podrías haber tenido la intención de anclar el patrón.
s/\.list$/.list.disable/
lo que habría impedido el intento de mover un archivo al directorio /etc/apt/sources.list.disable.d/ que no existe (por lo tanto, no puede mover un archivo a él).