GNU/Linux >> Tutoriales Linux >  >> Linux

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

El comando que está buscando es

mv * .[^.]* ..

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

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

Explicación:el mv El comando mueve archivos y directorios. El último argumento de mv es el destino (en este caso, el directorio un paso "arriba" en el árbol, .. ). Los argumentos anteriores son los archivos y directorios fuente. El asterisco (* ) es un comodín que coincide con todos los archivos que no comienzan con un punto. Los archivos que comienzan con un punto (dotfiles) están "ocultos". Se combinan usando el patrón .[^.]* (ver edición a continuación).

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

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

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

Como señala Paggas, también tendríamos que agregar el patrón .??* para hacer coincidir 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 dotfiles. Pero aún existe el problema con los archivos que comienzan con un guión. Y requiere tres comandos. Aún así, me gusta la idea. Propongo usarlo así:

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

Esto ejecuta shopt en una subcapa (por lo tanto, no hay una segunda llamada a shopt requerido) y usa -- para que los archivos que comiencen con un guión no se interpreten como argumentos para mv .


Respuesta corta:usar

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

Respuesta larga:

El comando

mv * .* ..

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

mv * .[^.]* ..

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

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

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

Mejor aún, puedes usar

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

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


Solo por el bien de la exhaustividad, también se puede indicar al shell de Bash que incluya archivos ocultos, usando shopt :

shopt -s dotglob
mv -- * ..
shopt -u dotglob

Linux
  1. ¿Cómo usar Wget para descargar archivos recursivamente de un directorio web?

  2. ¿Cómo mover todos los archivos (incluidos los ocultos) de un directorio a otro?

  3. ¿Cómo mover 100 archivos de una carpeta que contiene miles?

  4. ¿Cómo eliminar todos los archivos con una extensión particular en una carpeta particular?

  5. Descomprimir todos los archivos en un directorio

¿Cómo mover (y sobrescribir) todos los archivos de un directorio a otro?

Cómo mover todos los archivos, incluidos los archivos ocultos, al directorio principal a través de *

¿Cómo enumerar los archivos eliminados recientemente de un directorio?

¿Cómo chown/chmod todos los archivos en el directorio actual?

¿Cómo eliminar todos los archivos en un directorio excepto algunos?

¿Cómo crear enlaces simbólicos a todos los archivos (clase de archivos) en un directorio?