1 votes

Rsync à partir de la liste "files-from" mais aussi en supprimant les fichiers inutiles dans la destination

J'utilise rsync pour charger mon lecteur mp3 avec de la musique à partir d'un fichier texte, et j'aimerais donc supprimer les fichiers superflus qui ne sont pas inclus dans la liste "files-from". (Par exemple, si je ne veux plus d'une chanson particulière sur le lecteur et que je la supprime des listes de lecture).

J'ai essayé d'exclure tout le reste (--exclude="*.*") mais cela n'a pas non plus supprimé les fichiers superflus de la destination. La commande que j'utilise actuellement est la suivante.

rsync -vi --ignore-existing --files-from="~/include.txt" ~ ~/TestFolder/

Au début, j'avais utilisé toutes les options typiques de rsync (-aR, etc., mais elles semblent ne rien faire lors de la synchronisation à partir d'une liste de fichiers) et je les ai donc supprimées. Et je n'utilise que verbose et itemize changes à des fins de test pour pouvoir voir ce qui se passe. J'ai essayé d'ajouter -r avec --delete, mais cela ne fonctionne pas non plus. J'ai aussi essayé (--delete-excluded --exclude="*.*").

Des suggestions ?

Je suppose que je pourrais générer une liste de fichiers à supprimer puis les supprimer spécifiquement... mais n'est-ce pas ce que rsync DEVRAIT faire ?

0voto

user2634928 Points 21

Après quelques recherches supplémentaires, j'ai découvert que je ne peux pas faire cela sur rsync (du moins sur le rsync qui est installé sur mon mac).

Cependant, j'ai trouvé un script pour faire essentiellement cela. Vous devrez jouer avec les chemins d'accès et autres, mais cela fonctionne.

De l'utilisateur "cpbills" sur le site https://stackoverflow.com/questions/1813907/rsync-delete-files-from-list-dest-does-not-delete-unwanted-files

#!/bin/bash                                                                 

playlist_path="/home/cpbills/.config/mpd/playlists"
playlist="${playlist_path}/${1}.m3u"
music_src="/home/cpbills/files/music"
music_dst="/mnt/sdcard/music/"

if [[ -e "$playlist" ]]; then
  # Remove old files
  find "$music_dst" -type f | while read file; do
    name="$(echo "$file" | sed -e "s!^$music_dst!!")"
    if ! grep -qF "$name" "$playlist"; then
      rm "$file"
    fi
  done

  # Remove empty directories
  find "$music_dst" -type d -exec rmdir {} \; 2>/dev/null

  rsync -vu \
      --inplace \
      --files-from="$playlist" \
      "$music_src" "$music_dst"
else
  printf "%s does not exist\n" "$playlist" 1>&2
  exit 1
fi

Personnellement, j'ai doublé la ligne "supprimer les répertoires vides" parce que le script ci-dessus ne supprimera qu'une seule couche de répertoires vides. Ainsi, si vous avez /Dossier1/Dossier2/Dossier3 et que vous exécutez la commande, vous aurez toujours /Dossier1/Dossier2/. Si vous l'exécutez deux fois, vous aurez /Dossier1/Dossier2/.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X