¿Cómo muevo todos los archivos de un directorio (incluidos los ocultos) a otro directorio?
Por ejemplo, si tengo una carpeta "Foo" con los archivos ".hidden" y "notHidden" dentro, ¿cómo muevo ambos archivos a un directorio llamado "Bar"? Lo siguiente no funciona, ya que el archivo ".hidden" permanece en "Foo".
mv Foo/* Bar/
Inténtalo tú mismo.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Respuestas:
Zsh
o
(Omita
(N)
si sabe que el directorio no está vacío).Golpetazo
Ksh93
Si sabe que el directorio no está vacío:
Estándar (POSIX) sh
Si está dispuesto a permitir que el
mv
comando devuelva un estado de error a pesar de que tuvo éxito, es mucho más simple:GNU find y GNU mv
Hallazgo estándar
Si no le importa cambiar al directorio de origen:
Aquí hay más detalles sobre cómo controlar si los archivos de puntos coinciden en bash, ksh93 y zsh.
Golpetazo
Establece la
dotglob
opción .También está la
GLOBIGNORE
variable más flexible , que puede establecer en una lista de patrones comodín separados por dos puntos para ignorar. Si no está establecido (la configuración predeterminada), el shell se comporta como si el valor estuviera vacío sidotglob
está establecido, y como si el valor fuera.*
si la opción no está establecida. Consulte Expansión del nombre de archivo en el manual. Los directorios omnipresentes.
y..
siempre se omiten, a menos que.
el patrón coincida explícitamente.Ksh93
Establece la
FIGNORE
variable . Si no está establecido (la configuración predeterminada), el shell se comporta como si el valor fuera.*
. Para ignorar.
y..
, deben coincidir explícitamente (el manual en ksh 93s + 2008-01-31 establece eso.
y..
siempre se ignora, pero esto no describe correctamente el comportamiento real).Puede incluir archivos de puntos en un patrón uniéndolos explícitamente.
Para que la expansión salga vacía si el directorio está vacío, use la
N
opción de coincidencia de patrones:~(N)@(*|.[^.]*|..?*)
o~(N:*|.[^.]*|..?*)
.Zsh
Establece la
dot_glob
opción ..
y..
nunca coinciden, incluso si el patrón coincide.
explícitamente con el inicio.Puede incluir archivos de puntos en un patrón específico con el
D
calificador global .Añadir el
N
calificativo pegote para que la expansión salido vacía en un directorio vacío:*(DN)
.Nota: es posible obtener resultados expansión de nombre de archivo en diferentes órdenes (por ejemplo,
none
seguido por.one
seguido por..two
) en base a la configuración de losLC_COLLATE
,LC_ALL
yLANG
las variables.fuente
nullglob
? Tendría más sentido abortar elmv
comando (como fish, csh / tcsh, zsh (sin(N)
) do o bash con failglob) que ejecutar unmv /Bar/
comando que tiene poco sentido..
y..
nunca coincide (como en otros shells sensibles como zsh, fish, pdksh y derivados) incluso si desactiva dotglob nuevamente. (GLOBIGNORE=:; shopt -u dotglob; echo .*
no saldrá.
y..
). establecer GLOBIGNORE a.:..
o.
o:
tener el mismo efecto.ksh93
siempre ignorando.
y..
parece haberse roto entreksh93k+
(donde funcionó) yksh93m
(donde ya no funciona). Tenga en cuenta que es malo ya queksh93
tomará el valor de FIGNORE del entorno, por lo que,FIGNORE='!(..)'
por ejemplo , una variable de entorno puede crear estragos.De
man bash
fuente
mv
quejarse de que ese archivo llamadoFoo/*
no existe. Curiosamente, siFoo
se puede buscar, pero no se puede leer, y hay un archivo llamado*
allí, no obtendrá ningún error, ese archivo se moverá, pero no los otros en el directorio.bash
tiene unafailglob
opción para que se comporte más comozsh
,fish
ycsh
/tcsh
y anule el comando con un error cuando un globo no puede expandirse en lugar de ese comportamiento falso de dejar el globo como está.Una manera simple de hacer esto
bash
esPero esto también moverá directorios.
Si desea mover todos los archivos, incluidos los ocultos, pero no desea mover ningún directorio, puede usar un bucle for y probar.
for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;
fuente
Una forma es usar
find
:El
-type f
restringe el comando de búsqueda para buscar archivos. Debe investigar el-type
,-maxdepth
y-mindepth
opciones defind
personalizar su comando para dar cuenta de los subdirectorios. Find tiene una página de manual larga pero muy útil .fuente
Foo/
, no subdirectorios y otros archivos.Prueba el comando copiar
cp
:cp -r
significa copia recursiva, por lo que se copiarán todas las carpetas y archivos.Puede usar el comando
rm
eliminar para eliminar una carpeta:Ver más: mover todos los archivos de un directorio a otro .
fuente
Rsync es otra opción:
Esto funciona porque en rsync la barra inclinada final importa, se
sourcedirectory/
refiere al contenido del directorio, mientras quesourcedirectory
se referiría al directorio en sí.La desventaja de este método es que rsync solo limpiará los archivos después del movimiento, no el directorio. Entonces te quedas con un árbol de directorio de fuentes vacío. Para soluciones alternativas para eso, vea:
¿Mover archivos y eliminar directorios con rsync?
Entonces, aunque esto puede no ser óptimo para las operaciones de movimiento, puede ser extremadamente útil para las operaciones de copia.
fuente
Respuesta por bash / fish
Aquí hay una manera de hacerlo usando comodines:
.[!.]* ..?*
coincidirá con todos los archivos ocultos excepto.
y..
.[!.]* ..?* *
coincidirá con todos los archivos (ocultos o no) excepto.
y..
Y para responder el ejemplo particular de esta pregunta que necesita
cd foo && mv .[!.]* ..?* * ../bar
Explicación
.[!.]*
coincide con los nombres de archivo que comienzan con un punto, seguido de cualquier carácter, excepto el punto seguido opcionalmente por cualquier cadena. Esto está lo suficientemente cerca pero pierde archivos que comienzan con dos puntos como..foo
. Para incluir dichos archivos, agregamos los..?*
que coinciden con los nombres de los archivos que comienzan con dos puntos, seguidos de cualquier carácter, opcionalmente seguido de cualquier cadena.Prueba
Puede probar estos comodines con los siguientes comandos. Los he probado con éxito en bash y fish. Fallan bajo sh, zsh, xonsh.
fuente
También es posible que pueda encontrar y grep con comillas inversas para seleccionar archivos para el comando mover. Pasarlos a mv.
Es decir, para archivos ocultos
Entonces
Mueve solo los archivos ocultos seleccionados a
Bar
:Mueve todos los archivos de Foo a Bar desde el '.' en el comando egrep actúa como un comodín sin los corchetes.
El
^
personaje asegura que la partida comience desde el principio de la línea.Algunos detalles de la
egrep
coincidencia de patrones se pueden encontrar aquí .El uso de
maxdepth 1
paradas encuentra desde entrar en subdirectorios.fuente
Inspirado en esta respuesta :
Sin copiar los archivos ...
Advertencias:
--link-dest
la ruta debe ser absoluta o relativa al DESTINO (Bar
en el ejemplo)Debe colocar
/
después de SOURCE (Foo/
en el ejemplo), de lo contrario, copiará la carpeta SOURCE en lugar del contenido de la misma.fuente
Creo que esto funciona bien para bash y no hay necesidad de cambiar las opciones de shell
EDITAR:
Entonces, como dijo G-man, mi respuesta original no es compatible con posix y es más o menos lo mismo que la respuesta de ndemou anterior con un cambio, que es usar la expansión de llaves para crear listas de cadenas que luego se actúan. Esto solo significa que no necesita
cd
ingresar al directorio de origen. Realmente no es un cambio tan grande, pero es diferente.ejemplo: supongamos que ya tiene el siguiente diseño.
La pregunta original solo mencionaba archivos ocultos con un solo punto, pero digamos que hay algunos con dos o más puntos al comienzo del nombre. Simplemente puede agregar una expresión adicional en las llaves. Entonces podemos ejecutar
Esto se expande a lo siguiente:
Ahora debería ver todos los archivos ubicados en destdir :
Puedes hacer algunas cosas geniales con llaves en bash con más adiciones en 4.x. Echa un vistazo a bash-hackers para obtener algunos ejemplos ingeniosos.
fuente
..
, y (2) para cumplir con POSIX , debe usar en!
lugar de^
; es decir,{*,.[!.]*}
.cd
ingresar al directorio de origen para actuar sobre los archivos o escribir las mismas rutas de archivo una y otra vez para expresar las rutas a todos los archivos. Actualizaré el ejemplo en breve para darles a los lectores una mejor idea de lo que estoy hablando.Para distribuciones mínimas de Linux, lo siguiente debería funcionar. Primero, realice un movimiento básico de todos (que pierde los archivos ocultos). A continuación, mueva todos los archivos ocultos (incluyendo el
.
y..
que será no realmente se mueva).Notas: Si no hay contenido visible, el primer comando generará un mensaje de error. El segundo comando siempre producirá un error diciendo que no puede moverse
.
y..
. Como tal, simplemente canalice los errores/dev/null
(como se muestra).Si necesita esto como una línea, simplemente combínelos con un punto y coma:
fuente