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?
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
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.
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
.
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 {} \;
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.
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
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.