Question recherche uniquement les fichiers dans le répertoire avec des autorisations non définies sur 644 sous linux


C’est ma première question, même si je me cache depuis un moment.

Question: J'aimerais utiliser find pour obtenir uniquement les fichiers d'un répertoire avec des autorisations non définies sur 644 (ou une autre valeur d'autorisation). Existe-t-il un moyen plus court d’écrire ceci ou est-il le seul moyen d’utiliser simplement les options -perm et -or et de lister chaque type d’autorisation, à l’exception de 644?

Cela fait partie d'une commande plus importante que j'espérais accélérer:

find /path/to/dir/ -type f -print0 | xargs -0 chmod 644

J'espère que fournir xargs uniquement les noms de fichiers nécessitant une mise à jour accélérera le processus. Le répertoire contient environ un million de fichiers, mais seuls environ 10 000 ont généralement besoin d'autorisations mises à jour. Je pense que la commande est lente car elle continue malgré tout à canaliser tous les fichiers. Il existe peut-être une approche plus efficace de la commande la plus large. Faites-moi savoir si vous en connaissez un. J'aimerais quand même connaître la réponse à cette question. Et d'ailleurs, je ne peux pas mettre à jour les autorisations avant d'ajouter les fichiers au répertoire.


7
2017-07-30 21:19


origine


La commande s'exécute en moins de 2 secondes alors qu'avant, cela prenait plus de 5 minutes, il s'agit d'une méthode bien meilleure bien que je ne voie jamais d'exemples le faire de cette façon. Merci tout le monde. trouver / path / to / dir / -type f! -Perm 0644 -print0 | xargs -0 chmod 644 - M Brown


Réponses:


le ! L'opérateur renvoie vrai lorsqu'une condition est fausse.

Donc pendant -perm 0644 correspond aux fichiers qui ont rw-r - r-- autorisations définies, ! -perm 0644 correspond à ceux qui n'ont pas ces autorisations.

La commande dont vous avez besoin est:

find /path/to/dir/ -type f ! -perm 0644 -print0 | xargs -0 chmod 644

17
2017-07-30 21:30



Cela fonctionne très bien. Le ! Le drapeau était exactement ce dont j'avais besoin. La requête est maintenant presque instantanée au lieu de prendre environ 5 minutes. Je le vois maintenant mentionné dans le fichier man en bas. - M Brown


  find /path/to/dir ! -perm 0644 

Et

    find /path/to/dir ! -perm 0644 -exec chmod 0644 {} \;

3
2017-07-30 21:29



/ path / to / dir doit être avant le! - Matthew Flaschen
Cela fonctionne aussi, mais pour quelque raison que ce soit, -exec est plus lent que la canalisation vers xargs car il s'agit d'un répertoire volumineux. -exec peut exécuter des commandes individuelles au lieu de mettre en lot comme xargs? - M Brown
@M Brown, à l'avenir, essayez d'utiliser + au lieu de \;. Cela fera le même type de traitement que xargs. - Matthew Flaschen


Au moins avec GNU find, vous pouvez utiliser le! opérateur de négation avec -perm. Par exemple:

find /path/to/dir ! -perm 644

En vous basant sur l’exemple que vous donnez, cherchez-vous simplement à vous assurer que les propriétaires ont au moins lu / écrit et que tout le monde a au moins lu? Si oui, vous pouvez simplement le faire avec chmod:

chmod -R a+r,u+w /path/to/dir/*

3
2017-07-30 21:31



Le ! l'opérateur est ce qui me manquait. Je dois utiliser find puis pipe vers xargs en raison du grand nombre de fichiers du répertoire. chmod ne peut pas gérer le nombre de fichiers. - M Brown


Une solution possible serait si vous avez moins de répertoires, exécutez une chmod -R 644 /path/to/dir puis lancez un find /path/to/dir -type d -exec chmod 755 {} \;.


2
2017-07-30 21:31



Il n'y a pas de répertoires que des fichiers. J'utilise xargs à cause du grand nombre de fichiers. - M Brown