¿Cómo puedo chmod / chown una lista específica de archivos?

31

Quiero escribir un script .sh para configurar algunos permisos de carpeta, pero me pregunto si puedo ejecutar algo como:

chown -644 ./one;/two;/three

para crear una lista de carpetas, en lugar de llamar a chown varias veces.

Además, habría una forma de crear una lista de archivos y excluir algunos otros, como por ejemplo:

chown -R -664 ./*;!./cache

Espero que mis pseudo líneas de comando tengan sentido.

josef.van.niekerk
fuente

Respuestas:

43

Casi todas las herramientas de Unix aceptan una lista de archivos como argumentos sin opciones. Como de costumbre, los diferentes argumentos tienen que estar separados por espacio:

chown 644 one two three

En su segundo ejemplo, si está usando Bash, un simple

chown -R 644 !(cache)

será suficiente.

Este enfoque requiere una coincidencia de patrones extendida. Si está deshabilitado, puede habilitarlo con

shopt -s extglob

Consulte: Manual de referencia de Bash # Coincidencia de patrones

Dennis
fuente
4

Haga una lista de nombres de archivo en mod-these.txt y luego ejecute:

chmod g+w `cat mod-these.txt`

o use el método descrito por otros aquí:

chown 644 one two three

o vaya a la ciudad con la primera opción pero manipule cada línea del archivo (en este ejemplo: reemplace "/" (CON espacios en blanco antes) por "./"):

chmod g+w `sed 's/ \// .\//' update-writable.txt` 
Chonez
fuente
2

regex por la victoria!

usar find es la mejor forma en que puedo pensar fuera de usar la expresión regular que ya puede existir en su shell particular o dentro de la aplicación que está usando. primero, probé:

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

Pero, encontrará que la tubería no funciona en este caso. Otra cosa triste de aprender ... como aprender chmod, chown, chgrp, et. Alabama. no admite la selección / exclusión de múltiples archivos / expresiones regulares en sí ...
La solución que encontré:
/programming/19111067/regex-match-either-string-in-linux-find-command

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

por lo tanto, no hay mucha expresión regular para la victoria, pero al menos tenemos una manera de inyectar una lista de archivos en los argumentos de un programa en una sola línea.

notará que necesita escapar de los metacaracteres () y la adición del parámetro -o para cada nombre adicional ...

otros enlaces y contenido de mi parte que pueden interesarle a lo largo de sus viajes:
Varios trucos: notas de korn bourne y amigos. - Sitio web de Dave Horner

Aclamaciones.
--dave

Dave Horner
fuente
KISS gana, ¡Hazlo simple y estúpido! No es necesario hacer cosas complejas que puedan ser limpias y fáciles.
Al-Mothafar
2

Si los archivos que desea modificar están en un directorio, puede usarlos con el patrón necesario.

Por ejemplo, necesito que todos los archivos .run descargados en pwd se cambien a ejecutables:

chmod +x `ls *.run`
gat1
fuente