¿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.

Blankman
fuente
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).

enzotib
fuente
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
Lockwobr
fuente
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.
jpezz
fuente
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.

demian
fuente
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.

adamcatto
fuente