web-dev-qa-db-fra.com

Commande pour modifier les autorisations uniquement sur les fichiers et non sur les répertoires

J'ai la commande suivante

find . -type f -print0 | xargs -0 chmod 644 

qui passerait avec succès à 644 les autorisations sur tous les fichiers de., à condition que les noms de fichiers ne contiennent aucun espace incorporé. Cependant, cela ne fonctionne pas en général.

Par exemple

touch "hullo world"
chmod 777 "hullo*"
find . -type f -print0 | xargs -0 chmod 644 

résultats

/bin/chmod: cannot access `./hello': No such file or directory
/bin/chmod: cannot access `world': No such file or directory

Existe-t-il un moyen de modifier la commande afin qu’elle puisse traiter les fichiers contenant des espaces incorporés?

Merci beaucoup pour tout conseil.

3
Leo Simon

Sans xargs

find . -type f -exec chmod 644 {} \;

ou avec xargs

find . -type f -print0 | xargs -0 -I {} chmod 644 {}

les commutateurs xargs utilisés

  • -0 S'il y a des espaces ou des caractères (y compris les nouvelles lignes), de nombreuses commandes ne fonctionneront pas. Cette option prend en charge les noms de fichiers avec un espace vide.

  • -I Remplacez les occurrences de replace-str dans les arguments initiaux par des noms lus à partir de l'entrée standard. De plus, les espaces non cités ne terminent pas les éléments en entrée; au lieu de cela, le séparateur est le caractère de nouvelle ligne.

Explication prise de ici

6
A.B.