Estoy migrando mi directorio de inicio de un sistema antiguo a uno nuevo, y el tarball que hice contiene todo, incluidos archivos ocultos como .bashrc. Sin embargo, cuando muevo el contenido del tarball desempaquetado (que están en / tmp) a mi nuevo directorio de inicio, los archivos ocultos no se copian ( mv /tmp/home/rcook/* /home/rcook/
). ¿Cómo puedo hacer que mv los mueva?
En realidad, creo que el problema no es con mv, sino con el problema de bash. Si hago esto:
mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/
Veo esto:
a/:
. .. .foo
b/:
. .. bar
a/.foo
no se movió. Entonces, ¿cómo puedo obtener el comodín * para encontrar archivos ocultos?
Sí, supongo que podría descomprimir el tarball directamente en mi directorio de inicio, pero el tarball se descomprime home/rcook/...
y quiero asegurarme de sobrescribir el nuevo .bashrc
, etc.con las versiones antiguas y personalizadas, y saber cómo encontrar y mover archivos ocultos. Es una habilidad que vale la pena. Sugerencias?
Algunas respuestas sugieren hacer algo como mv src/.* dest/
. Sin embargo, intenté esto en mis directorios de prueba y obtuve errores. Empezando con:
rcook$ ls -a a/ b/
a/:
. .. bar .foo
b/:
. ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
. .. bar
b/:
. .. .foo
¿Qué estoy haciendo mal?
fuente
Respuestas:
Puedes hacerlo :
Puedes poner
en su
~/.bashrc
si desea que sea el predeterminado.Ver http://mywiki.wooledge.org/glob
Otro enfoque para copiar los archivos de puntos:
No utilice el patrón
..*
como coincide..
(puntero al directorio principal). Si hay archivos cuyo nombre comienza con dos puntos (..something
), también use el patrón..?*
.fuente
.
y..
son directorios especiales: respectivamente, el directorio actual y el directorio principal . Es solo una advertencia. Mejorshopt -s dotglob
solución de usomv home/rcook/* /home/rcook/
seguido pormv home/rcook/.* /home/rcook/
. Esto funcionó, aunque desearía haber seguido el enlace y leer sobre el modo dotglob primero. Me hubiera ahorrado un paso. +1zsh
, puede usar elD
calificador global o laGLOB_DOTS
opción de shell .En sus adiciones, obtuvo errores pero el código aún funcionó. La única cosa que añadir es que usted haya indicado solamente para copiar los archivos punto. Tratar:
Aún obtendrá los errores para el. y ... entradas, lo cual está bien. Pero el movimiento debería tener éxito.
fuente
.hidden
embargo, terminé moviendo el único archivo que tenía explícitamente para resolver mi problema.|| :
(||
significa ejecutar lo siguiente en falso / error,:
es un comando noop). Pero eso también suprimiría errores legítimos, por ejemplo, la carpeta de destino no existe. No puedo encontrar una manera más elegante usandomv
para excluir las entradas.
y..
. Butt big plus para mí sobre cp no es escribir nuevos archivos en el disco.Si está
ls -l
en un directorio, verá.
y..
entre los archivos enumerados. Entonces, creo quemv .* /dest
toma en cuenta esos indicadores. Tratar:esto ignorará los punteros de directorio actuales y principales.
Obtendrá un error si cualquiera de los tres patrones
*
,[^.]*
o..?*
partidos ningún archivo, por lo que sólo debe incluir los que coinciden.fuente
Dos posibles soluciones en las que puedo pensar. El primero es usar cp en su lugar con su opción recursiva, copiando el directorio actual al destino.
entonces puede eliminar los archivos de origen en el directorio actual
Alternativamente, si sabe que los archivos tienen nombres correctos (sin espacios, comodines, caracteres no imprimibles), puede hacer algo como esto
fuente
-p
de preservar metadatos. Usarls
debería ser el último recurso, y aquí hay formas mejores y más simples.Realmente no hay tal cosa como archivos "ocultos" en Linux. Los archivos que comienzan con un punto simplemente están ocultos de las listas de archivos de forma predeterminada.
Para copiar los archivos, incluso con un pegote, es necesario anteponer el archivo con
.
comomv -u .* foo
y luego.foo
se appearn comofoo/.foo
cuando se mueven.La opción -u solo moverá los archivos cuando el origen sea más nuevo o falte el destino. O bien, puede ignorar los errores sobre el movimiento
.
y,..
dado que son archivos especiales y no se pueden mover, pero.*
el shell lo atrapa en el globo.fuente
Entonces tenemos:
y:
Me tomé un tiempo enorme para encontrar una mejor solución que todas las respuestas aquí.
Luego tomé 30 segundos para este comando:
Entonces encontré mi amor:
Nota: Ni siquiera entiendo el argumento
-T
. Simplemente hizo lo que necesitaba. Aquí dice:fuente
-T
. De cualquier manera, esto esencialmente le dice a mv que mueva el directorio en sí, en lugar de mover todos los archivos desde su interior.En mi caso, simplemente estaba intentando
mv
un único archivo oculto y esta fue la solución:Explicación
Al principio estaba intentando:
Pero siguió produciendo el error:
A pesar de
ls -al
que mostró que el archivo ydest/
existía.La razón parece ser porque el shell estaba interpretando el "." en el nombre del archivo, por lo que al moverlo a una variable evita la interpretación. Probablemente hay otras formas de resolver esto, pero esto fue suficiente para nosotros.
fuente
Si desea copiar archivos, incluidos los archivos ocultos, en el directorio actual en el que se encuentra.
fuente