web-dev-qa-db-fra.com

Comment copier des fichiers et leur donner l'autorisation de répertoire de destination

Je copie des fichiers de la source vers l'emplacement. La source ne m'appartient pas et l'autorisation pour les fichiers à la source est ---- rwx ---. L'autorisation des fichiers copiés dans le répertoire de destination qui m'appartient est ---- r-x ---. L'autorisation du répertoire de destination est drwxrwsrwx. Comment puis-je avoir les fichiers avec la même autorisation de répertoire de destination. J'ai essayé "cp --no-preserve = all" mais cela n'a pas fonctionné (toujours la même permission).

10
Nasreddin

Essaye ça:

cp --no-preserve=mode,ownership $backupfile $destination
13
Giordano

Permettez-moi de reformuler cela pour "Comment conserver les autorisations du répertoire de destination sur la copie?"
Je ne peux pas m'attribuer le mérite de la réponse car je viens de combiner quelques réponses que j'ai trouvées dans la nature. Alors ça vient.

Premièrement

Les autorisations ne sont généralement pas propagées par le répertoire dans lequel les fichiers sont copiés, mais les nouvelles autorisations sont plutôt contrôlées par l'umask de l'utilisateur . Cependant, lorsque vous copiez un fichier d'un emplacement à un autre, c'est un peu un cas spécial où l'umask de l'utilisateur est essentiellement ignoré et les autorisations existantes sur le fichier sont préservées.

Ce qui explique pourquoi vous ne pouvez pas directement propager les autorisations du répertoire src vers le répertoire dst.

Cependant, il existe une solution de contournement en deux étapes.

  1. cp-metadata : Copiez les attributs et seulement les attributs que vous souhaitez conserver dans le répertoire source. Voici un script rapide qui peut le faire:
#!/bin/bash
# Filename: cp-metadata

myecho=echo 
src_path="$1"  
dst_path="$2"

find "$src_path" |
  while read src_file; do
    dst_file="$dst_path${src_file#$src_path}"
    $myecho chmod --reference="$src_file" "$dst_file"
    $myecho chown --reference="$src_file" "$dst_file"
    $myecho touch --reference="$src_file" "$dst_file"
  done

Vous pouvez ignorer la commande touch si vous ne souhaitez pas conserver l'horodatage. Remplacer myecho=echo avec myecho= pour exécuter réellement les commandes.
Gardez à l'esprit que ce script doit être exécuté en mode Sudo afin de pouvoir exécuter chown et chmod efficacement

  1. cp --preserve: Après avoir exécuté avec succès la première commande, il est maintenant temps de copier le contenu et les attributs dans le répertoire dst.

    --preserve [= ATTR_LIST]
    conserve les attributs spécifiés (par défaut: mode, propriété, horodatages), si possible des attributs supplémentaires: contexte, liens, xattr, tous

    \cp -rfp $src_dir $dst_dir devrait faire ce que vous voulez.

1
laertis