web-dev-qa-db-fra.com

Script pour déplacer des fichiers de plus de 5 jours

Je travaille actuellement sur un script qui me permet de déplacer tout fichier de plus de 5 jours dans un dossier d’archive avec le même chemin, à l’exception du dossier racine qui change. Donc, quelque chose comme: root/subdir1/subdir2/file à rootarchive/subdir1/subdir2/file. Cela devrait fonctionner de manière récursive.

J'ai déjà essayé de créer un foreach pour tous les fichiers du dossier "racine":

#!/bin/bash
find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
      mv $file ../rootarchive/"$file"
done

Mais cela ne fonctionnait pas correctement car la commande mv ne parvenait pas à trouver la destination spécifiée ../rootarchive/"$file". Quelqu'un parmi vous a-t-il une idée de la façon dont je pourrais résoudre ce problème?

3
user472513

Vous devez créer l'arborescence de répertoires à partir de subdir1/subdir2/ - mv ne le fera pas pour vous. Vous pourriez faire, par exemple:

find . -type f -mtime +5 -print0 | while IFS= read -r -d '' file; do
    dir="${file%/*}"
    mkdir -p ../rootarchive/"$dir"
    mv "$file" ../rootarchive/"$file"
done

Vous pourriez rsync. Il peut recréer la structure de répertoires et effacer les fichiers copiés:

find . -type f -mtime +5 -print0 | 
  rsync -0avP  --remove-source-files --files-from=- ./ ../rootarchive

Pour rsync:

  • -0 indique que les listes de fichiers sont séparées par un caractère NULL. Cela affecte:
  • --files-from= lit la liste des fichiers à copier (à partir de stdin: -).
  • -a active le mode d'archivage, qui conserve les autorisations de fichiers, la propriété, etc.
  • --remove-source-files supprime les fichiers qui ont été copiés avec succès de la source.
  • -vP active le mode prolixe et les informations de progression.
8
muru