Pregunta ¿Cómo puedo hacer que chown trabaje recursivamente?


Tengo un directorio llamado pdfs que contiene un grupo de subdirectorios y subdirectorios secundarios. Quiero cambiar la propiedad de todos los archivos PDF en todas las subcarpetas. Acabo de probar esto:

chown -R someuser:somegroup *.pdf

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

De acuerdo con la página del manual para chown, el -R debe significar recursivo:

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

¿Qué me estoy perdiendo?


226


origen




Respuestas:


El modo recursivo solo funciona en directorios, no en archivos. Al usar glob '* .pdf' el shell pasa la lista de archivos a chown, que los ve como archivos y cambia los permisos en los archivos que ve, y eso es todo.

Recuerde, en los proyectiles, el glob es evaluado por el shell, no por el comando. Si el globo coincide con los archivos, se pasan al comando y el comando nunca sabe si existió un globo. (Esto es diferente de cómo el prompt de comando de Windows solía hacer cosas). Si tiene un directorio, con el contenido algo como:

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

Y tu escribiste:

chown -R someuser:somegroup *.pdf

El caparazón primero haría la lista: archivo1.pdf archivo2.pdf

y luego ejecuta tu comando:

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

Mira, no hay un directorio para -R para actuar. Hace lo que le pediste: cambiar la propiedad de los dos archivos en la línea de comando, ignorando ese peculiar indicador -R.

Para hacer lo que desee, utilice el '* .pdf' como un patrón para este directorio y subdirectorios, puede usar find, que puede encontrar archivos que coincidan con un patrón de nombre de archivo (o muchos otros elementos de la pantalla) y pasar a un subcomando

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

Esto comienza en el directorio actual '.' buscar archivos (tipo de archivo f) del patrón de nombre '*.pdf' luego pasa a xargs, que construye una línea de comando para chmod. Observe las comillas alrededor del patrón '*.pdf', recuerde que el caparazón creará un glob si puede, pero desea que el patrón pase a find, entonces necesitas citarlo

Debido a que los nombres de archivo pueden tener espacios en ellos, desea utilizar un truco para que sea seguro para el nombre del archivo-con-espacios:

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

En bash 3 y versiones inferiores, esta es la forma en que debes hacerlo. El globbing más poderoso está disponible en bash 4 (con shopt -s globstar) y otras conchas. Lo mismo en zsh, usando un glob recursivo **:

chown -R someuser:somegroup ./**/*.pdf

232



Editado para reflejar ese bash 4 con shopt -s globstar hace globbing recursivo. - kojiro
@kojiro gracias! como puedes ver, todavía uso bash3 - Rich Homolka
De acuerdo con la página del manual que se muestra en el póster original, encontré que el chown -R efectivamente cambió el propietario en las carpetas Y archivos. No hay necesidad de encontrar Usando Mint 15. - gwideman
@gwideman Sé que esto es viejo ... Pero sí, por supuesto, R es recursivo. El OP solo tenía un problema con un tipo de recursión muy específico, una extensión y el "tipo de archivo es archivo" filtrado - Rich Homolka
@RichHomolka Ah. OP dijo que los archivos estaban en un directorio llamado 'pdfs', así que asumí que el problema estaba en cómo especificar pdfs como el directorio a recurse, y que todos los archivos contenidos eran pdfs, por lo que no es necesario seleccionarlos específicamente. Pero es posible que tenga razón, si el trabajo consiste en seleccionar solo archivos pdf y dejar otros sin cambios. - gwideman


No es complicado.

chown -R someuser:somegroup /your/folder/here/*

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


29



Claramente, alguien lo contesta desde hace 4 años, pero es por la advertencia. - Francisco Tapia
Esta pregunta actualmente es # 1 en Google, por lo que es importante tener en cuenta la respuesta correcta. - Sprachprofi
seguro, el aceptado es más elegante, legible y completo - Francisco Tapia
De algun modo sudo chown -R user ./ funcionó para mí, pero sudo chown -R user ./* no lo hizo - Slav
Sé que esto es viejo, pero aunque esto responde al titular, no responde la pregunta. Esto es en realidad un poco peor que lo que OP ya había intentado. - Rich Homolka


Puedes usar el find utilidad:

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

Por favor, no olvide las citas *.pdf. De lo contrario, el caparazón intentará expandirlo. Esto significa que ya el caparazón reemplazará *.pdf con los nombres de todos los archivos PDF encontrados en el directorio actual. Pero eso no es lo que quieres. Desea encontrar los archivos PDF ubicados en subdirectorios. Por cierto: ese es también el problema con tu chown mando.


14



Tuve que buscar el +, buen truco para el rendimiento. -exec command {} + Esta variante de la acción -exec ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se construye agregando cada nombre de archivo seleccionado al final; el número total de invocaciones del comando será mucho menor que el número de archivos coincidentes. La línea de comando está construida de la misma manera que xargs construye sus líneas de comando. Solo una instancia de {} está permitido dentro del comando. El comando se ejecuta en el directorio de inicio. - Patrick M
@PatrickM una (menor) otra ventaja a + vs; .... plus no es un personaje meta de shell y no tiene que ser escapado - Rich Homolka


El comando

chown -R someuser:somegroup *.pdf

solo recurrirá directorios hacia abajo si el directorio el nombre termina en .pdf. Necesitas algo como:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

6



Técnicamente, solo bajará un nivel. si llama a esa recursión verdadera o no, es un ejercicio para el usuario :) - Rich Homolka


Para cambiar la propiedad de un directorio recursivamente, simplemente use:

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

aquí username = el nuevo usuario que debería ser el dueño del directorio

groupname = el nuevo grupo que debería ser el propietario del directorio

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


0



Esto no hace lo que el OP pidió. Esto cambia la propiedad de todo, OP pidió un conjunto específico de archivos. - Rich Homolka


yo suelo tree en 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 del sistema.


0