¿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.
¿Cómo mover todos los archivos del directorio actual al directorio superior en linux?
He intentado algo como mv *.*
, pero no funciona.
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
.
.[^.]*
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
.
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 * .[^.] .??* ..
!
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.
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
.
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:
| evita que los alias alteren mv indeseablemente.
– evita que los nombres de archivo que contienen guiones iniciales (-xyz) sean interpretados como argumentos de línea de comandos.
.[^.] coincide con todos los nombres de archivo de dos caracteres que empiecen por . excepto ..
.??* coincide con todos los demás nombres de archivo de tres caracteres o más.
Implementaciones ingenuas:
Lo siguiente omite los nombres de archivo UNIX ocultos, los que empiezan por . (.bashrc).
Lo siguiente coincide con .. que recursivamente intenta mover cada directorio eventualmente hasta / en .. del directorio de trabajo actual ($PWD o pwd). No utilizar nunca.
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.
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 .
.
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.
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/.
.
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> ..
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
.