El modo recursivo solo funciona en directorios, no en archivos. Al usar el glob '* .pdf', el shell pasa la lista de archivos a chown, que ve que son archivos y cambia los permisos en los archivos que ve, y eso es todo.
Recuerde, en shells, el glob es evaluado por el shell, no por el comando. Si el glob coincide con los archivos, se pasan al comando y el comando nunca sabe que existe un glob. (Esto es diferente de cómo el símbolo del sistema de Windows solía hacer cosas). Si tiene un directorio, con los contenidos algo así 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 ejecuta 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 comando, ignorando esa peculiar bandera -R.
Para hacer lo que quiera, para usar el '* .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 si puede, pero desea que se pase el patrón find
, por lo que debe citarlo.
Debido a que los nombres de archivo pueden tener espacios, debe usar un truco para que sea seguro para nombre de 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 debe hacerlo. Se dispone de un engrosamiento más potente en bash 4 (con shopt -s globstar
) y otros proyectiles. Lo mismo en zsh, usando un globo recursivo **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
hace recursive globbing.Esto aplicará chown a todos los archivos y todos los subdirectorios y subdirectorios de la carpeta especificada. Usar con cuidado.
fuente
sudo chown -R user ./
funcionó para mí, perosudo chown -R user ./*
no lo hizo.env
.Puedes usar la
find
utilidad:Por favor, no olvide las citas alrededor
*.pdf
. De lo contrario, el shell intentará expandirlo. Esto significa que el shell ya se 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 también es el problema con suchown
comando.fuente
+
truco ordenado 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 crea 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 se construye de la misma manera quexargs
construye sus líneas de comando. Solo{}
se permite una instancia de dentro del comando. El comando se ejecuta en el directorio de inicio.El comando
solo repetirá directorios si el nombre del directorio termina en .pdf. Necesitas algo como:
fuente
para cambiar la propiedad de un directorio de forma recursiva simplemente use:
aquí nombre de usuario = el nuevo usuario que debería ser propietario del directorio
groupname = el nuevo grupo que debería ser propietario del directorio
cada archivo / directorio tiene un propietario de usuario y un propietario de grupo
fuente
Yo uso
tree
en su lugar:También tenga cuidado de no ejecutar chown recurrente o chmod en el directorio '/' u otro directorio del sistema.
fuente
Para convertirse en el propietario de todos los archivos en un directorio, use
en vez de
o
que podría no funcionar si hay demasiados argumentos producidos por * (demasiados archivos en el directorio) o que no hace lo que desea, respectivamente.
fuente