Mueve el contenido de la carpeta un nivel arriba

127

Tengo un directorio que está desempaquetado, pero está en una carpeta. ¿Cómo puedo subir el contenido un nivel? Estoy accediendo a CentOS a través de SSH.

Caleb
fuente

Respuestas:

189

Con la carpeta llamada 'myfolder' y un nivel superior en la jerarquía de archivos (el punto que desea que se coloque), el comando sería:

mv myfolder/* .

Entonces, por ejemplo, si los datos estaban /home/myuser/myfolderallí, /home/myuser/ejecute el comando.

Rudu
fuente
35
Es posible que deba coincidir .*no solo *si el archivo contiene archivos de puntos. Agregue también `&& rmdir myfolder` al final o para eliminar la carpeta ahora extraña. Esto se guarda porque solo se ejecutará si el mv devuelve el éxito Y porque rmdir no eliminará un directorio no vacío.
Caleb
Buen punto en el .*. Eliminar la carpeta original es trivial y no se solicita, por lo que dejaremos que OP se encargue de eso.
Rudu
1
@Caleb, ¿es posible escribir ambos *y .*en una línea? solo curiosidad
Richard
2
@ Richard Sí, lo es. mvTodos los argumentos para serán fuentes excepto el ÚLTIMO argumento que debe ser el objetivo para mover (y en el caso de múltiples fuentes, debe ser una carpeta).
Caleb
1
Me estoy poniendo bash:/bin/mv: Argument list too long
dragosrsupercool
26

Solo para aclararlo, tomado de la respuesta de Rudu anterior, y de los comentarios.

Si necesita mover todo el contenido, INCLUIDOS los archivos que comienzan con a. (como .htaccess, .git, etc.), debe incluir tanto * como. * en su comando. Al igual que:

 mv subfolder/* subfolder/.* .

Eso moverá el contenido de la subcarpeta a su carpeta actual. Tenga en cuenta el espacio antes del último ".".

Ricardo
fuente
funciona pero me sale mv: rename fake/. to ./.: Invalid argumentymv: rename fake/.. to ./..: Invalid argument
Maslow
16

Esto es posible con los siguientes métodos:

  • Utilizando rsync:

    rsync -vua --delete-after foo/ .
  • Usando cpy rmdir:

    cp -vaR foo/. . && rmdir foo/
  • Usando mv(con la dotglobopción habilitada):

    shopt -s dotglob # Includes filenames beginning with a dot.
    mv -- foo/* .    # Where foo/ is the folder consisting the files.
    shopt -u dotglob # Disables previously enabled dotglob option.
    

    dónde foo/está tu carpeta cuyo contenido se va a mover un nivel hacia arriba.

    Ver: help shopty man bash.

  • Usando mv(como se sugiere aquí ):

    mv foo/* foo/.[^.]* . && rmdir foo/

    Nota: Perdería un archivo llamado foo/..bar...

    Nota: Para los shells POSIX, necesita [!.].

kenorb
fuente
¿Cuáles son los interruptores de rsync -v, -u, -ay -rhaciendo? AFAICT, -ves detallado, lo que hace que rsync imprima más información. -usignifica actualización: solo copie un archivo si es más nuevo. Eso no parece relevante. -asignifica archivo. Eso copiará el propietario y los permisos del archivo, y hará que la sincronización sea recursiva. -rsignifica recursivo, pero eso ya está cubierto por -a.
rjmunro
-ues útil cuando no desea pasar más tiempo moviendo datos que ya están allí (especialmente para dispositivos de almacenamiento lento). He eliminado -r, ya que está cubierto por -alo que mencionaste.
kenorb
1
mv foo/* foo/.[^.]* .echaría de menos un archivo llamado foo/..bar..por ejemplo. Tenga en cuenta que para shells POSIX, necesita [!.].
Stéphane Chazelas
Cabe mencionar que rsync -vua --delete-after foo/ .elimina todo lo demás que ya podría existir en el directorio actual.
David
7

solo emita un comando mv

mv (directory)/* .

si desea eliminar el directorio, agregue

rm -rf (directory)

Se supone que está en un directorio padre de (directorio)

Si estás dentro del (directorio) entonces

mv * ../
Ranjith Siji
fuente
13
Consejo de seguridad adicional: al eliminar un directorio que sabe que debe estar vacío, se rmdirqueja y se cierra si el directorio no está vacío, mientras rm -rque simplemente lo habría eliminado y todo su contenido. (Es un poka-yoke .)
Anko
Gran punto! No se me ocurre una razón para no hacerlo de esa manera.
Mark Lalor
@MarkLalor Una razón podría ser la presencia de archivos ocultos, como los omnipresentes .DS_storeen macOS. El mvcomando anterior no los moverá (sin dotglobestablecer).
AkselA
0

para aquellos de ustedes en un servidor compartido tendrían que usar algo como esto

Para mover los archivos

mv -v ~/public_html/public_html/* ~/public_html/

Para copiar los archivos

cp -a ~/public_html/public_html/* ~/public_html/

Ricardo Havoc
fuente
2
La pregunta anterior se refiere a mover no copiar contenidos. Esto duplicaría los archivos al dejar los originales en una subcarpeta. También ser un servidor "compartido" o no realmente no tiene nada que ver con esto.
Caleb
1
a la derecha y aquí está la respuesta ...
Ricardo Havoc
2
Re su edición: ¿en qué se diferencia eso de la respuesta ya votada ? ¿Y qué tiene que ver un "servidor compartido" con él? Por favor, editar para explicar estos artículos si esto va a ser una contribución útil que añade valor a lo que ya está aquí.
Caleb
1
No estoy de acuerdo con que el servidor compartido no tenga nada que ver con eso. La forma en que se ingresa el "directorio" hace una gran diferencia ..
Ricardo Havoc
1
amigo, ¿por qué estás tan enojado? ... wow ... solo estaba compartiendo un poco de conocimiento. Todos entendemos de manera diferente y enfrentamos diferentes problemas técnicos de manera diferente ... Que tengas un buen día Caleb ..
Ricardo Havoc