¿Cómo mover todos los archivos en la carpeta actual a la subcarpeta?


70

Estoy en el camino

/myuser/downloads/

Y creo una subcarpeta:

/myuser/downloads/new

Ahora quiero mover todos los archivos y carpetas / subcarpetas en la carpeta de descargas a la subcarpeta.

¿Cómo puedo hacer esto?

Lo intenté:

mv -R *.* new/

Pero mover no toma el interruptor -R parece.


44
No necesitas -R. Sólo mv * newembargo, se quejan "no se puede mover a la nueva nueva" o algo similar. Quizás mv -i * newpara evitar sobreescrituras.

Respuestas:


101

El comando

mv !(new) new

debería hacer el truco. Si no funciona, corre shopt -s extglobprimero.

Para mover también archivos / directorios ocultos (que comienzan con un punto), ejecute también shopt -s dotglobprimero.
Así que para resumir:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(siempre es mejor desarmar dotglobpara evitar malas sorpresas).


55
¿Puedes mencionar cuál es el significado de !(something)?
Adeerlike

2
@adeer que solo dice no (algo). En otras palabras, copie todo pero no algo. ¿Claro como el barro?
RockyMountainHigh

44
muy. ¿sabes el equivalente de zsh?
Adeerlike

1
No lo entiendo, por ejemplo, ¿qué sucede si intento mover el contenido de la carpeta deva mi ubicación actual, tengo que ejecutar mv !(dev) dev? Obtengo-bash: !: event not found
Black

55
@adeer muy similar. setopt extendedglobpara establecer el modo glob extendido en zsh. ^es el símbolo de exclusión, por mv ^new newlo que sería el truco. luego para ver todas las opciones configuradas en zsh que puede usar setopty para deshabilitar el modo glob extendido que puede hacerunsetopt extendedglob
Mr. T

10

Encontré algo como esto, pero es un poco más simple de entender, y podría funcionar bien para usted también:

ls | grep -v new | xargs mv -t new

Agregar una explicación a la solución anterior:

De las páginas del manual:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Explicado por paso:

  • ls enumerará los archivos en el directorio actual
  • grep -v new regresará canalizado a que no coincide con nuevo
  • xargs mv -t newmoverá los archivos canalizados al grep -vdirectorio de destino

He intentado este método, pero me estoy haciendo: mv: illegal option -- t. ¿Es esto porque estoy usando zsh?
ConstantFun

@ConstantFun Podría ser zsh pero supongo que es su implementación de mv, (lo que significa que su versión de mv es diferente a lo que estaba usando) ¿qué sistema operativo está usando? Creo que cuando escribí esta respuesta estaba centosusando Linux Distro bash.
lockwobr

2
Simplemente probando esto en osx y obtengo el mismo error, mv: illegal option -- tporque el mv de osx no tiene una -topción.
lockwobr

1
(No he intentado esto, y no planeo hacerlo). Este enlace apple.stackexchange.com/questions/69223/… te dice cómo instalar el gnucore que debería ayudarte a obtener utilidades cln de gnu core, osx se envía con bsd Herramientas cli que son diferentes a las que vienen con Linux.
lockwobr

Estoy en OSX corriendo zsh, ¿entonces es probable que sea el sistema operativo entonces ...? ¡Gracias por aclararlo!
ConstantFun

7

Idea simple. Suponiendo que usted está en / miUsuario , cambiar el nombre de descargas de nuevo , crear una nueva descarga de directorio a continuación, pasar nuevo en él.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Si desea mover todos los archivos de una carpeta a una de sus subcarpetas, puede usar el siguiente comando:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Encontrará todos los archivos y luego los moverá a su subcarpeta.

@waltinator: agregado -type d -name 'new' -prunepara evitar el desplazamiento de /myuser/downloads/new.


newmv: missing file operandTry 'mv --help' for more information
Creé

1

Puede probar este proceso alternativo: permanecer en el camino

/myuser/downloads/

pero, en lugar de crear primero el /myuser/downloads/new/directorio, en lugar de crear una carpeta en el /myuser/directorio, con el comando mkdir ../new, a continuación, mover todos los archivos en downloadsa new, y finalmente moverse newen downloads. Puede hacer esto en una línea, mientras está en la /myuser/downloads/ruta, con el comando:

mkdir ../new && mv * ../new && mv ../new ../downloads

En este caso, usted no tiene que preocuparse por ningún tipo de "filtrado" de archivos / carpetas, ya que newestá en el mismo nivel de la ruta como downloads, lo que sólo puede mover todo en downloadsa new, y luego pasar newa downloads`.

Sin embargo, si ya tiene la subcarpeta newcreada y no desea crear otra, no se preocupe, simplemente cambie el mkdircomando en el lado izquierdo del primero &&en el comando que se muestra arriba a un mvcomando, empujando hacia newarriba en el camino; en otras palabras, mientras todavía estás dentro /myuser/downloads/, puedes cambiar mkdir ../newa mv new ... Luego, la subcarpeta new[en el camino /myuser/downloads/new/] se empuja hacia arriba /myuser/new/, al mismo nivel que /myuser/downloads/, y luego puede ejecutar el resto del comando como se muestra arriba. Todos juntos, tenemos, comenzando desde el camino /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

y, como quería "mover todos los archivos y carpetas / subcarpetas de la carpeta de descargas a la subcarpeta [ new]", ¡ya está! Si hubiera querido mover solo archivos (o solo carpetas o [insertar movimiento de objetos más granular]), entonces tendría que usar otros comandos que pueden "filtrar" objetos, como grep. Sin embargo, los comandos escritos anteriormente son suficientes para sus propósitos.

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.