Debe ser una pregunta popular pero no pude encontrar una respuesta.
Cómo mover todos los archivos a través de * incluidos los archivos ocultos al directorio principal como este:
mv /path/subfolder/* /path/
Esto moverá todos los archivos al directorio principal como se esperaba, pero no moverá los archivos ocultos. ¿Como hacer eso?
cp -r /path/to/source/. /destination
Respuestas:
Puede encontrar un conjunto completo de soluciones al respecto en la respuesta de UNIX y Linux a ¿Cómo se mueven todos los archivos (incluidos los ocultos) de un directorio a otro? . Muestra soluciones en Bash, zsh, ksh93, estándar (POSIX) sh, etc.
Puede usar estos dos comandos juntos:
O todos juntos ( gracias pfnuesel ):
Que se expande a:
(ejemplo: se
echo a{.,}b
expande aa.b ab
)Tenga en cuenta que esto mostrará un par de advertencias:
Simplemente ignórelos: esto sucede porque
/path/subfolder/{.,}*
también se expande a/path/subfolder/.
y/path/subfolder/..
, que son el directorio y el directorio principal (consulte ¿Qué significan "." Y ".." cuando están en una carpeta? ).Si solo desea copiar, puede usar un simple:
Esto copiará todos los archivos, tanto los normales como los ocultos, ya que se
/path/subfolder/.
expande a "todo lo de este directorio" (Fuente: ¿Cómo copiar con cp para incluir archivos ocultos y directorios ocultos y su contenido? )fuente
mv /path/subfolder/* /path/subfolder/.* /path/
, no es estrictamente necesario para combinar los dos comandos en uno.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
denota directorio actual y..
denotaup
directorio. Debes haber notado que todos los demás archivos se mueven.Creo que este es el más elegante, ya que tampoco intenta moverse
..
:fuente
..anything
o...anything
etc. - stackoverflow.com/a/31438355/2351568 contiene la expresión regular correcta para este problema. || ¡Pero de todos modos usarshopt -s dotglob
sigue siendo la mejor solución!{a,b}*
encontraría todos los archivos que empiecen con aob, como "anatomía" y "bulldozer". La segunda coincidencia es solo una coincidencia vacía, equivalente a*
, y la primera coincidencia es equivalente a.[!.]
, donde el grupo[!.]
significa un grupo que NO comienza con a.
. Esto significa.*
pero no..*
.Podrías encender
dotglob
:Para apagar
dotglob
, deberías decir:fuente
man shopt
que no funciona yhelp shopt
es muy breve. Pero puedes hacerlobashman () { man bash | less -p "^ $1 "; }
y luegobashman shopt
leer todo sobre él directamente. (Es posible que tenga que presionar n para saltar al comando si hay líneas que comienzan con shopt, como descubrí).ls
... por lo tanto, no es realmente lo que querrías, probablementeUna solución alternativa más sencilla es utilizar la
rsync
utilidad:Nota: El comando anterior mostrará lo que se va a cambiar. Para ejecutar los cambios reales, elimine
--dry-run
.La ventaja es que la carpeta original (
subfolder
) se eliminaría así como parte del comando, y al usarmv
ejemplos aquí, aún necesita limpiar sus carpetas, sin mencionar el dolor de cabeza adicional para cubrir archivos ocultos y no ocultos en una sola. patrón.Además,
rsync
brinda soporte para copiar / mover archivos entre controles remotos y aseguraría que los archivos se copien exactamente como estaban originalmente (-a
).El
-u
parámetro utilizado omitiría los archivos más nuevos existentes, volvería-r
a los directorios y-v
aumentaría la verbosidad.fuente
sudo
y--dry-run
, para que la gente pueda probar los cambios antes de ejecutar el comando real para evitar posibles problemas.Permítanme presentarles a mi amigo "dotglob". Se activa y desactiva si "*" incluye archivos ocultos o no.
El valor predeterminado es "desactivado".
Es mejor volver a encenderlo cuando haya terminado, de lo contrario confundirá las cosas que asumen que estará apagado.
fuente
Al usar el
find
comando junto con elmv
comando, puede evitar que elmv
comando intente mover directorios (por ejemplo,..
y.
) y subdirectorios. Aquí tienes una opción:Hay problemas con algunas de las otras respuestas proporcionadas. Por ejemplo, cada uno de los siguientes intentará mover subdirectorios de la ruta de origen:
Además, 2) incluye el. y .. archivos y 3) pierde archivos como ..foobar, ... barfoo, etc.
Podría usar
mv /source/path/{.[!.],..?,}* /destination/path
,, que incluiría los archivos omitidos por 3), pero aún así intentaría mover subdirectorios. Usar elfind
comando con elmv
comando como describo anteriormente elimina todos estos problemas.fuente
Mi solución para este problema cuando tengo que copiar todos los archivos (incluidos los
.
archivos) en un directorio de destino que conserva los permisos es: (sobrescribir si ya existe)yes
es para sobrescribir automáticamente archivos de destino,r
recursivo,v
detallado,p
retener permisos.Observe que la ruta de origen no termina con a
/
(por lo que se copian todos los archivos / directorio y archivos.)El directorio de destino termina
/
cuando colocamos el contenido de la carpeta de origen en el destino como un todo.fuente
yes
es un comando increíble para usar si desea anular los archivos de destino, no siempre se desea. Úselo solo si está seguro de que desea hacer esto. Además, ¿hay alguna diferencia entreyes | cp ...
ycp -f ...
?