¿Qué pasó cuando "mv *"? No se mostraron errores y ahora solo queda una carpeta. ¿Por qué?

12

El comando ejecutado fue "mv space *" en una carpeta con 14 GB de datos.

mv *

du -hs 

es lo mismo, entonces, ¿dónde se han ido los 14 GB de datos? ¿Qué he hecho?

usuario3032965
fuente
Se necesita más información. ¿Cual plataforma?
Jarmund
44
@Jarmund Creo que es seguro asumir algunos * nix, considerando que ambos comandos mencionados son comandos comunes en sistemas tipo Unix. En este sentido, creo que es seguro decir que la mayoría de los proyectiles funcionan igual. Por lo tanto, podemos deducir lo suficiente como para dar una respuesta útil a pesar de que la plataforma exacta no se establece explícitamente.
un CVn
Otra trampa para mencionar. NUNCA debe ejecutar mvo cpcon " " datos no confiables. Esto se debe a que " " se expande y los archivos con nombres como "--verbose" obtienen argumentos de línea de comandos. Qué usar en su lugar:cp ./* anotherFolder
VasyaNovikov

Respuestas:

30

Supongo que bash expande el comodín y, por lo tanto, mueve cada carpeta a la última.

Por ejemplo:

$ ls
test1  test2  test3  test4

$ mv *

$ ls
test4

$ ls test4
test1  test2  test3

Aquí, mv *se expande mv test1 test2 test3 test4al mv [OPTION]... SOURCE... DIRECTORYformato correspondiente . Por lo tanto, cada carpeta se mueve a la última.

ssssteffff
fuente
99
Esta. Por cierto, si desea usar *en un mv(o cp), eche un vistazo a su --target-directoryinterruptor. Se asegura de que no te muerdan cosas como esta.
un CVn
2

Según lo descrito por @ssssteffff, con mv *, el shell está haciendo una expansión comodín desde los archivos en el directorio actual. Sin embargo, el comportamiento del mvcomando depende de cuántos argumentos se *expanden. Si hay más de dos argumentos, el último argumento debe ser un directorio:

   mv [OPTION]... SOURCE... DIRECTORY

Entonces,

Creé 5 archivos

$ touch 1 2 3 4 5
$ ls
1  2  3  4  5
$ mv *
mv: target ‘5’ is not a directory
$ ls
1  2  3  4  5

Ahora, si creo un directorio que viene como último parámetro para la expansión de comodines, entonces:

$ mkdir 6
$ mv *
$ ls
6
$ ls 6
1  2  3  4  5

Deberías verificar dos veces cuál fue el último argumento.

  • Si el último argumento fue un directorio, entonces sus datos tal vez estén seguros.
  • Si el número total de argumentos fue 2, y el último argumento fue un directorio, entonces sus datos tal vez estén seguros.
  • Si el número total de argumentos fue 2, y el último argumento fue un archivo, entonces el segundo archivo se ha ido con seguridad.

¿Estás seguro de que no viste el error algo como esto?

 mv: target ‘5’ is not a directory`
esmoquin
fuente