Tilde (~) dentro del directorio de trabajo de Unix


22

Entonces, estoy trabajando en un entorno UNIX y noté que dentro de mi directorio de trabajo, que está a millas de distancia de mi hogar UNIX, hay un ~.

Ahora, una vez en el pasado, lo hice rm -rf ~desde mi directorio de trabajo y terminé borrando completamente mi directorio de inicio y tuve que involucrarlo.

No quiero volver a hacerlo. Al mismo tiempo, quiero saber

  1. ¿Por qué se ~crea en mi directorio de trabajo? ¿Es un deslizamiento de dedo defectuoso al guardar ( :w!pero lo que sucede es :w~?!)

  2. Antes de registrarse, hay una secuencia de comandos que busca archivos o carpetas adicionales que p4 desconoce, por lo que definitivamente esto ~podría causar un problema. Entonces, ¿cómo puedo eliminar ~mi directorio de trabajo y al mismo tiempo no borrar mi casa?

Tengo un comando de copia de seguridad llamado delque uso en lugar de rm -rf. Simplemente coloca cosas en una ubicación temporal. Podría usar eso y deshacerme del ~. Pero estoy más interesado en saber por qué sucede esto y cómo puedo eliminarlo.


Normalmente, el shell reemplaza ~ al comienzo de una ruta con su directorio de inicio. Use la ruta completa /home/yourUserName/~para acceder al directorio llamado ~.
jofel

Y ~ otheruser / file se puede utilizar para hacer referencia a los directorios de inicio de otros usuarios, en aras de la integridad.
godlygeek

Parece una broma!
Xolve

Respuestas:


36

Cítelo:

rm -i '~'
rm -i "~"
rm -i \~

O referencia por una ruta, en lugar de solo un nombre base:

rm -i ./~
rm -i /path/to/~

Tenga en cuenta que, a pesar de ser un nombre de carácter único de aspecto gracioso, esto no es conceptualmente diferente de si hubiera creado un archivo llamado SOME$PATHhaciendo

touch 'SOME$PATH'

Y trató de eliminarlo haciendo:

rm -i SOME$PATH

( Advertencia: la variable SOME$PATH no se cita por el bien del ejemplo aquí. Normalmente se incluiría entre comillas 'SOME$PATH' )

En ambos casos, el shell está expandiendo el nombre que le das, y debes evitarlo.

Además: ¡No lo use rm -rfpara eliminar un archivo! Todo el propósito rm -res decir rmque está bien eliminar directorios. Si no desea eliminar accidentalmente directorios completos mientras intenta eliminar archivos, ¡no los pase habitualmente -r!


12
Acabo de probar esto. :w~en vim creó un archivo llamado ~. rm ~devuelto cannot remove /home/seth it is a directory. rm "~"eliminó el archivo . Solo para subrayar , no pase -rfautomáticamente .
Seth

44
+1 por recomendar omitir opciones violentas por defecto. Esto es similar a hacerlo kill -9por defecto, lo que he visto.
Celada

Veo que el ejemplo rm -i $FOOintencionalmente no cita la variable por el bien del ejemplo, pero aún así: mostrar un ejemplo de shell que involucra rmy una variable no citada como argumento es MUY MALO , lo siento, independiente del contexto. Estoy seguro de que incluso se puede probar :) Agregaré una nota, pero ¿tal vez podría cambiar el ejemplo, un poco?
Volker Siegel

@VolkerSiegel, punto tomado: participé de su edición, pero la nota al pie de página parecía demasiado pesada. También cambié a un nombre de variable que es menos probable que cause problemas: la mayoría de las personas no tienen un archivo con nombre en SOME/bin:/usr/binninguna parte de su sistema de archivos. :)
godlygeek

Si, se ve bien! (Casi iba a responder: ¿Qué? ¿Mano dura? ¿Alguna vez experimentaste un problema real de citas en tu vida?;) Solo un poco desesperado por la cantidad de ejemplos de shell incorrectos, en general ... Oye, es difícil entender incluso sin ejemplos equivocados! )
Volker Siegel

1

La tilde cuando se usa solo en el contexto de ls ~listará su directorio de inicio como ~ es un acceso directo a su directorio de inicio. Si lo hiciste ls ~brown, enumerarás el contenido del directorio de inicio de brown.

VIM, a menos que se le indique lo contrario, creará una copia de seguridad de un archivo modificado: myFile myFile ~.

Este comportamiento es bueno ya que crea una copia de seguridad, pero si no lo desea, agregue un archivo .vimrc: no configure ninguna copia de seguridad (a la que acabo de acceder vi ~/.vimrc).

Y, por supuesto, como dijeron otros, si tiene un archivo llamado ~, simplemente escape del carácter como \ ~

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this

0

Esto podría ser efectuado por mistypes. Si su TERM=xtermconfiguración es similar a la mía, prácticamente todas las teclas de función en su teclado enviarán secuencias de escape como ...

infocmp -1 | grep -n \~ | tail -n3
138:    kich1=\E[2~,
141:    knp=\E[6~,
142:    kpp=\E[5~,

Más de la mitad de la salida de infocmp -1contiene ~tilde se escapa en mi máquina, y no entiendo qué hacen la mayoría de ellos. Sé que zshal menos en realidad se come la porción escapada de la cuerda en la mayoría de los casos, y deja solo la ~tilde .

Por ejemplo, escribir echoa continuación, <space>a continuación, F6y <return>las impresiones ...

/home/mikeserv

La secuencia de escape real enviada es ...

kf6=\E[17~

Curiosamente, hay otras de estas secuencias de escape que contienen >caracteres.

infocmp -1 | grep \>
is2=\E[!p\E[?3;4l\E[4l\E>,
rmkx=\E[?1l\E>,
rs2=\E[!p\E[?3;4l\E[4l\E>,

Esos son escapes de uso común: cadenas de reinicio e inicialización. No es difícil imaginar que un teclado caído o un golpe de botón de algún tipo cuando un shell interactivo está esperando la entrada podría dar lugar a ~archivos truncados aleatoriamente en todo su sistema de archivos. Al menos, ocasionalmente aparece en la mía.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.