¿Cómo puedo obtener mv (o el * comodín) para mover archivos ocultos?

100

Estoy migrando mi directorio de inicio de un sistema antiguo a uno nuevo, y el archivo comprimido que hice contiene todo, incluso archivos ocultos como .bashrc. Sin embargo, cuando muevo el contenido del archivo comprimido no empaquetado (que están en / tmp) a mi nuevo directorio principal, 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 bash's globbing. 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 archivo tar directamente en mi directorio principal, pero el tarball se descomprime en 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, probé esto en mis directorios de prueba y obtuve errores. Comenzando 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?

    
pregunta Randall Cook 21.02.2013 - 20:14

7 respuestas

113

Puedes hacer esto:

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

Puedes poner

shopt -s dotglob

en su ~/.bashrc si desea que sea el predeterminado.

Ver enlace

Otro enfoque para copiar los archivos de puntos:

mv /tmp/home/rcook/.[!.]* /home/rcook/

No use el patrón ..* ya que coincide con .. (puntero al directorio principal). Si hay archivos cuyo nombre comienza con dos puntos ( ..something ), también use el patrón ..?* .

    
respondido por el Gilles Quenot 21.02.2013 - 20:16
23

En tus adiciones, obtuviste errores pero el código aún funcionaba. Lo único que se debe agregar es que solo le dijiste que copiara los archivos de puntos. Prueba:

mv src/* src/.* dst/

Seguirá recibiendo los errores para. y ... entradas, lo cual está bien. Pero el movimiento debería tener éxito.

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move ‘from/.’ to ‘to/.’: Device or resource busy
mv: cannot remove ‘from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test
    
respondido por el Andrew Schwartz 03.01.2014 - 19:47
10

Si ls -l en un directorio, verá . y .. entre los archivos listados. Entonces, creo que mv .* /dest toma esos punteros en cuenta. Prueba:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

esto ignorará los punteros de dir actuales y principales.

Obtendrá un error si alguno de los tres patrones * , [^.]* o ..?* no coincide con ningún archivo, por lo que solo debe incluir los que coinciden.

    
respondido por el Azamat 14.06.2014 - 14:20
5

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.

cp -Rp . /desired/directory

luego puedes eliminar los archivos fuente en el directorio actual

Alternativamente, si sabe que los archivos tienen un nombre correcto (sin espacios, comodines, caracteres no imprimibles), puede hacer algo como esto

mv $(ls -A) /desired/directory
    
respondido por el Drake Clarris 21.02.2013 - 23:03
2

No hay realmente archivos "ocultos" en Linux. Los archivos que comienzan con un punto están ocultos de las listas de archivos por defecto.

Para copiar archivos incluso con un globo terráqueo, debe agregar un prefijo al archivo con . como mv -u .* foo y luego .foo aparecerá como foo/.foo cuando se mueva.

La opción -u solo moverá los archivos cuando la fuente sea más nueva o falte el destino. O simplemente podría ignorar los errores sobre mover . y .. ya que son archivos especiales y no se pueden mover, pero quedan atrapados en el .* glob por el shell.

    
respondido por el dobey 21.02.2013 - 20:17
0

Así que tenemos:

a
|-- .foo
'-- bar

y:

b

Tomé un enorme tiempo para encontrar una mejor solución que todas las respuestas aquí.

Luego tomé 30 segundos para este comando:

$ mv --help

Entonces encontré mi amor:

$ mv a/ b/ -T

Nota: Ni siquiera entiendo el argumento -T . Simplemente hizo lo que necesitaba. Aquí dice:

  

-T, --no-target-directory trata a DEST como un archivo normal

    
respondido por el user433901 28.07.2015 - 02:42
-1

Si desea copiar archivos que incluyen archivos ocultos en el directorio actual en el que se encuentra.

cp -Rp source-directory/. .
    
respondido por el Rick 05.09.2016 - 02:51

Lea otras preguntas en las etiquetas