Cómo crear un directorio de forma recursiva, incluidos archivos o directorios ocultos

37

Parece que chown con la bandera recursiva no funcionará en directorios o archivos ocultos. ¿Hay alguna solución simple para eso?

Toby
fuente

Respuestas:

56

Estoy bastante seguro de que la -Rbandera funciona, siempre me ha funcionado de todos modos. Lo que no funcionará, y lo que me hizo tropezar temprano en mi uso de la línea de comandos, es usarlo *en un directorio con archivos / directorios ocultos. Haciendo

$ chown -R /home/user/*

no hará los archivos y directorios ocultos. Sin embargo, si lo sigues con

$ chown -R /home/user/.[^.]*

entonces harás todos los archivos ocultos (pero no .o ..como /home/user/.*lo harías). Habiendo dicho todo eso, esperaría

$ chown -R /home/user

para obtener todos los archivos y directorios ocultos /home/user, aunque eso, por supuesto, también cambiará los permisos del directorio en sí, lo que podría no ser lo que pretendía.

Hamish Downer
fuente
3
Hacer un chownen el directorio tiene el efecto secundario de que cambie los permisos en el directorio en sí, así como todo su contenido, que puede o no ser lo que desea.
wfaulk
A + funcionó como un encanto para mí.
SuperFamousGuy
Lo intenté chown nginx:nginx -R /path/to/.[^.]*y solo cambió la propiedad a archivos ocultos .dot. no todo.
Pathros
@wfaulk Como mencionó @Hamish Downer, debe hacer ambos *y seguirlo .[.^]*para obtener todos los archivos.
god_is_love
9

Creo que el siguiente comando debería funcionar para esto

chown -hR userid:usergroup /nameofdirectory/nameofsubdir/
MattrixHax
fuente
1
-h afecta los enlaces simbólicos en lugar de cualquier archivo referenciado (útil solo en sistemas que pueden cambiar la propiedad de un enlace simbólico)
R. van Twisk
8

"chown -R" funciona, pero una alternativa sería usar find.

 find /path/to/dir -exec chown USER {} \;
hayalci
fuente
55
tenga en cuenta que con GNU find, usar en +lugar de ;como el terminador de -exec será más eficiente, ya que usará la cantidad mínima necesaria de horquillas para cortar en lugar de una bifurcación por archivo / directorio
guisado
3

Puede cambiar el dotglobatributo temporalmente para expandirlo. archivos y luego revertirlo.

shopt -s dotglob; chown -R user:group FOLDER; shopt -u dotglob

Más información dotglobse puede encontrar aquí

stdcall
fuente
2

El uso de bucle con la ls -Aopción, podemos encontrar todos los archivos ocultos y el directorio excluir .y ..a continuación, cambiar la propiedad de todos los archivos ocultos y directorio.

for i in `ls -A | grep "^\."`;do chown -R user:group $i;done

Usar xargsopción conls -A

ls -A | grep "^\." | xargs chown user:group

Para más detalles, haga clic aquí y visite mi sitio

Ranjeet_Automation_Tester
fuente
1

Además, si eres como yo, probablemente ejecutarás chown principalmente desde el directorio actual. Yo estaba acostumbrado a correr de esta manera: chown rails.rails -R *. Simplemente cambiando el asterisco a un punto (abreviatura del directorio actual) de esta manera: chown rails.rails -R .trae todos los directorios ocultos.

Craig
fuente
2
Con el efecto secundario de que cambia los permisos en el directorio actual, así como todos sus contenidos, que pueden o no ser lo que desea.
wfaulk
1

chownfuncionará con archivos y directorios ocultos. En el siguiente ejemplo, cambiaremos la propiedad de usuarios y grupos para todos los archivos en ~/some/folder. Todos los archivos incluyen todos los archivos ocultos (por ejemplo .bashrc, .profileetc.) y carpetas en el ~/some/foldernivel y debajo. Tenga en cuenta en particular que no deseamos cambiar la propiedad de ~/some, por lo que excluiremos el archivo ~/some/..de los cambios de propiedad.

$ cd ~/some/folder 
$ sudo chown -R usrname:grpname . 
$ 
Seamus
fuente
Esto funcionó para mí
klor
0

Para dividir TODOS los archivos en el directorio y subdirectorios actuales para el usuario actual;

find . -exec chown $(whoami) {} \;

o si el usuario no puede crear algunos archivos debido a permisos restringidos;

sudo find . -exec chown $(logname) {} \;
5p0ng3b0b
fuente
-2

Podrías hacer algo como

for i in `ls -A`;do chown -R user:group $i;done

El -A( capital A) es importante ya que excluye '.' y '..'

Zypher
fuente
Esto cambiará solo los archivos y subdirectorios en el directorio actual, no los niveles inferiores. (Que puede ser lo que quiere el OP). También se romperá en los nombres de archivos y directorios con espacios (o pestañas) en ellos.
wfaulk