it-swarm-es.com

¿Cómo puedo hacer que funcione correctamente?

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

chown -R someuser:somegroup *.pdf

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

De acuerdo con 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?

267
Nathan Long

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

Recuerde, en shells, el globo es evaluado por el Shell, no el comando. Si el glob coincide con los archivos, se pasan al comando y el comando nunca sabe que existió glob. (Esto es diferente de cómo solía hacer el comando de Windows). Si tienes un directorio, con los contenidos 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: archivo1.pdf archivo2.pdf

y luego ejecute su comando:

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

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

Para hacer lo que quiera, para usar '* .pdf' como 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 criterios) y pasar a un subcomando

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

Esto comienza en el directorio actual '. para 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 Shell creará un globo global si puede, pero desea que el patrón pase a find, por lo que debe citarlo.

Debido a que los nombres de archivos pueden tener espacios en ellos, usted quiere 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 bash 3 e inferior, esta es la forma en que necesitas hacerlo. Se dispone de un globbing más potente en bash 4 (con shopt -s globstar) y otros shells. Lo mismo en zsh, usando un glob recursivo **:

chown -R someuser:somegroup ./**/*.pdf
275
Rich Homolka
chown -R someuser:somegroup /your/folder/here/*

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

45
Sprachprofi

Puedes usar la utilidad find:

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

Por favor, no olvide las citas alrededor de *.pdf. De lo contrario el Shell intentará expandirlo. 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. Desea encontrar los PDF archivos ubicados en subdirectorios. Btw .: Ese es también el problema con su comando chown.

14
bmk

El comando

chown -R someuser:somegroup *.pdf

solo repetirá los directorios si el nombre directorio termina en .pdf. Necesitas algo como:

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

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 del sistema.

0
Eduard Florinescu

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

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

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

groupname = el nuevo grupo que debe ser propietario del directorio

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

0
KawaiKx

Para convertirse en el propietario de todos los archivos en 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

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

0
masterxilo