2011-03-22 16:29:12 +0000 2011-03-22 16:29:12 +0000
308
308

¿Cómo puedo hacer que el chown funcione de forma recursiva?

Tengo un directorio llamado pdfs que contiene un montón de sub y subdirectorios. Quiero cambiar la propiedad de todos los archivos PDF de todas las subcarpetas. Acabo de probar esto:

chown -R someuser:somegroup *.pdf

…pero no cambió la propiedad de los PDF en los subdirectorios. El usuario y el grupo existen.

Según la página de manual de chown, el -R debería significar recursivo:

-R, --recursive
          operate on files and directories recursively

¿Qué me estoy perdiendo?

Respuestas (7)

315
315
315
2011-03-22 16:47:32 +0000

El modo recursivo sólo funciona en los directorios, no en los archivos. Usando el glob ‘*.pdf’ el shell pasa la lista de archivos a chown, que ve que son archivos, y cambia los permisos de los archivos que ve, y eso es todo.

Recuerda, en los shells, el glob es evaluado por el shell, no por el comando. Si la glob coincide con los archivos, se pasan al comando y el comando nunca sabe que existió una glob. (Esto es diferente a como el símbolo del sistema de comandos de Windows solía hacer las cosas). Si tienes un dir, con el contenido algo como:

machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/

Y escribiste:

chown -R someuser:somegroup *.pdf

El shell primero haría la lista: file1.pdf file2.pdf

y luego ejecutaría tu comando:

chown -R someuser:somegroup file1.pdf file2.pdf

Mira, no hay un directorio para que -R actúe. Hace lo que le pediste - cambiar la propiedad de los dos archivos en la línea de comandos, ignorando esa extraña bandera -R.

Para hacer lo que quieras, usa el ‘*’. pdf’ como patrón para este directorio y subdirectorios, puedes usar find, que puede encontrar archivos que coincidan con un patrón de nombre de archivo (o muchos otros criterios) y pasar a un subcomando

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

Esto comienza en el actual dir ‘.’ para buscar archivos (tipo de archivo f) de nombre patrón '*.pdf' luego pasa a xargs, que construye una línea de comando a chmod. Fíjate en las comillas alrededor del patrón '*.pdf', recuerda que la shell creará un globo si puede, pero quieres que el patrón pase a find, así que necesitas citarlo.

Como los nombres de archivos pueden tener espacios en ellos, quieres usar un truco para hacer que el nombre de archivo con espacios sea seguro:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

En el bash 3 e inferior, esta es la forma en que necesitas hacerlo. Un globbing más poderoso está disponible en el golpe 4 (con shopt -s globstar) y otras conchas. Lo mismo en zsh, usando un globo recursivo **:

chown -R someuser:somegroup ./**/*.pdf
57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

Esto se aplicará a todos los archivos y a todos los subdirectorios y subcarpetas de la carpeta especificada. Usar con cuidado.

14
14
14
2011-03-22 16:37:41 +0000

Puedes usar la utilidad find:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

Por favor, no olvides las citas alrededor de *.pdf. De lo contrario, la cáscara tratará de expandirla. Esto significa que ya el shell reemplazará *.pdf con los nombres de todos los archivos PDF que se encuentran en el directorio actual. Pero eso no es lo que quieres. Quieres encontrar los archivos PDF ubicados en subdirectorios. Por cierto..: Ese es también el problema con su comando chown.

6
6
6
2011-03-22 16:38:07 +0000

El comando

chown -R someuser:somegroup *.pdf

sólo se volverá a bajar de los directorios si el nombre del directorio termina en .pdf. Necesitas algo como:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;
1
1
1
2016-05-11 01:38:58 +0000

para cambiar la propiedad de un directorio de forma recursiva simplemente use:

sudo chown -R <username>:<groupname> <dir name>

aquí username = el nuevo usuario que debe ser propietario del directorio

groupname = el nuevo grupo que debe ser propietario del directorio

cada archivo/directorio tiene un usuario propietario y un grupo propietario

0
0
0
2018-01-25 13:36:51 +0000

Yo uso tree en su lugar:

sudo tree -fai ~/.blabla | xargs -L1 -I{} sudo chown youruser:youruser {}

También tenga cuidado de no ejecutar chown recursivo o chmod en el directorio ‘/’ u otro directorio de sistema.

0
0
0
2019-01-29 20:22:33 +0000

Para convertirse en el dueño de todos los archivos de un directorio, use

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

en lugar de

sudo chown $USER directory\*

o

sudo chown --recursive $USER directory

que podría no funcionar si hay demasiados argumentos producidos por * (demasiados archivos en el directorio) o que no hace lo que usted quiere respectivamente.