2009-10-28 18:54:06 +0000 2009-10-28 18:54:06 +0000
134
134

¿Cómo mover todos los archivos del directorio actual al directorio superior?

¿Cómo mover todos los archivos del directorio actual al directorio superior en linux?

He intentado algo como mv *.*, pero no funciona.

Respuestas (11)

204
204
204
2009-10-28 19:01:58 +0000

El comando que busca es

mv * .[^.]* ..

o (vea abajo para más información):

(shopt -s dotglob; mv -- * ..)

Explicación: el comando mv mueve archivos y directorios. El último argumento de mv es el objetivo (en este caso el directorio que está un paso “arriba” en el árbol, ..). Los argumentos anteriores son los archivos y directorios de origen. El asterisco (*) es un comodín que coincide con todos los archivos que no comienzan con un punto. Los archivos que empiezan por un punto (dotfiles) están “ocultos”. Se comparan con el patrón .[^.]* (véase la edición más abajo).

Consulte la página de manual que he enlazado para obtener más información sobre mv.

  • *

¿Por qué .[^.]* en lugar de .* ?

Como Chris Johnsen señala correctamente: el patrón .* también coincide con . y ... Como no quiere (ni puede) moverlos, es mejor utilizar un patrón que coincida con cualquier nombre de archivo que empiece por un punto excepto esos dos. El patrón .[^.]* hace precisamente eso: coincide con cualquier nombre de archivo (1) que empiece por un punto (2) seguido de un carácter que no sea un punto (3) seguido de cero o más caracteres arbitrarios.

Como Paggas señala , también tendríamos que añadir el patrón .??* para que coincida con los archivos que comienzan con dos puntos. Vea su respuesta para una solución alternativa usando find .

La respuesta de Arjan menciona shopt para evitar todos esos problemas con los archivos de puntos. Pero sigue existiendo el problema con los archivos que empiezan con un guión. Y requiere tres comandos. Aun así, me gusta la idea. Propongo usarlo así:

(shopt -s dotglob; mv -- * ..)

Esto ejecuta shopt en un subshell (por lo que no se requiere una segunda llamada a shopt) y utiliza -- para que los archivos que comienzan con un guión no sean interpretados como argumentos a mv.

45
45
45
2009-10-28 20:19:07 +0000

Respuesta corta: utilice

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Respuesta larga:

El comando

mv * .* ..

no funcionará ya que .* puede coincidir con . y ... Pero el comando

mv * .[^.]* ..

tampoco funcionará, ya que .[^.]* no coincidirá, por ejemplo, con ..filename. En su lugar, lo que hago es

mv * .[^.] .??* ..

que coincidirá con todo excepto con . y ... * coincidirá con todo lo que no empiece por ., .[^.] coincidirá con todos los nombres de archivo de 2 caracteres que empiecen por un punto excepto .., y .??* coincidirá con todos los nombres de archivo que empiecen por un punto con al menos 3 caracteres.

Mejor aún, puede usar

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

¡que evita los feos hacks de glob en mv * .[^.] .??* ..!

14
14
14
2009-10-28 20:52:27 +0000

Sólo para completar, uno también puede decirle al shell Bash que incluya los archivos ocultos, usando shopt :

shopt -s dotglob
mv -- * ..
shopt -u dotglob
8
8
8
2011-08-02 20:46:48 +0000

El mv carece de la funcionalidad de mover archivos ocultos cuando se usa * - así que ¿por qué no usar copy en su lugar?

cp -rf . ..

rm -rf *

No es necesario entrar en soluciones complejas de dotglobbing y usar comandos find.

7
7
7
2013-01-20 11:47:53 +0000
rsync -a --remove-source-files . ..

rsync es una herramienta de copia de archivos extremadamente potente, generalmente utilizada para realizar copias de seguridad remotas incrementales y réplicas eficientes.

Con el comando anterior, le estamos diciendo a rsync que copie el contenido de . en ..

El switch -a habilita la recursión en subdirectorios de . y habilita algunas otras opciones comunes.

El modificador --remove-source-files le dice a rsync que elimine los archivos de origen después de una copia exitosa, es decir, hace que rsync se comporte de manera similar al comando mv.

2
2
2
2011-08-12 08:12:49 +0000

Este comando minimizado funciona en la mayoría de los shells modernos:

\mv -- {,.{[^.],??}}* ..

Por lo demás es una solución portable:

\mv -- * .[^.] .??* ..

Características:

  1. | evita que los alias alteren mv indeseablemente.

  2. – evita que los nombres de archivo que contienen guiones iniciales (-xyz) sean interpretados como argumentos de línea de comandos.

  3. .[^.] coincide con todos los nombres de archivo de dos caracteres que empiecen por . excepto ..

  4. .??* coincide con todos los demás nombres de archivo de tres caracteres o más.

Implementaciones ingenuas:

  1. Lo siguiente omite los nombres de archivo UNIX ocultos, los que empiezan por . (.bashrc).

  2. Lo siguiente coincide con .. que recursivamente intenta mover cada directorio eventualmente hasta / en .. del directorio de trabajo actual ($PWD o pwd). No utilizar nunca.

2
2
2
2009-10-28 18:59:46 +0000

En última instancia, intentar mv . fallará porque mv no podrá desvincular el directorio en el que se encuentra actualmente. Podrías mv * .. para mover los archivos en el cwd.

2
2
2
2013-10-22 22:24:11 +0000

Es más correcto utilizar el patrón * .[!.] .??* que * .[^.] .??* ya que el primero también funcionará con shells más antiguos como ksh88:

mv -- * .[!.] .??* ..
  • -- evita problemas cuando tiene un nombre de archivo que comienza con -
  • * coincide con todos los nombres de archivo que no comienzan con .
  • no hay nombres de archivo de un carácter que comiencen con . que pueda/deba mover
  • .[!.] coincide con todos los nombres de archivo de dos caracteres que empiecen por .
  • .??* coincide con todos los nombres de archivo de tres caracteres (o más) que empiecen por .

Con ksh88, el patrón de nombre de archivo .[^.] coincidirá de hecho con los nombres de archivo .. (que siempre existe) y .^ (que probablemente no existe), teniendo un efecto contrario al deseado.

2
2
2
2009-10-28 19:47:28 +0000
mv * .??* ../.

* obtiene todos los archivos no puntuales. .??* obtiene todos los archivos . de al menos tres bytes de longitud, lo que funciona para todos los legítimos. Cualquier cosa que quede probablemente querrá rm en lugar de mv de todos modos.

El ../. no ofrece ningún beneficio directo sobre el .. pero cuando se hace un movimiento a un directorio es un muy buen hábito a adquirir, porque fallará, como usted quiere, si hay algo malo en la ruta. Por ejemplo, mv xyz bletch, donde usted piensa que bletch es un directorio, puede ser más seguro con mv xyz bletch/..

0
0
0
2014-05-12 23:08:11 +0000

Find y grep también funcionan. Este tipo de estructura puede ser útil si quieres seleccionar archivos con criterios más complicados modificando find y egrep.

find -maxdepth 1 | egrep '^./.' # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
0
0
0
2014-08-06 16:37:16 +0000

Creo que la solución más fácil para mover todos los archivos a su dir. padre sería

mv "`ls`" ../

o, Si hay archivos/directorios ocultos

use:

mv "`ls -a`" ../ 2>/dev/null

También, digamos que quiere mover el contenido de alguna carpeta a una de sus carpetas internas tony(digamos)

use:

mv "`ls -a`" /tony 2>/dev/null

Nota:

"`ls -a`"

Para mover los archivos que tienen espacios.

2>/dev/null

Es para suprimir la advertencia/error porque ls -a imprimiría la carpeta . y .. también y no se puede mover o copiar. Así que para esas carpetas mostrará el error (si no usamos 2>/dev/null) de que no puede moverlas y el resto se moverá cómodamente.

Lo mejor es evitar el ls -a si no hay archivos ocultos y usar simplemente el ls.