Comment trouver et copier des fichiers vers un seul répertoire de manière récursive sous Linux ?

Publié 8 septembre 2024

Problème : Localiser et copier des fichiers dans plusieurs répertoires sous Linux

Trouver des fichiers spécifiques dans plusieurs répertoires sous Linux peut s'avérer complexe. Copier ces fichiers vers un seul emplacement ajoute une difficulté supplémentaire, surtout avec des structures de dossiers imbriqués.

La solution Linux : Utiliser les commandes find et copy

Utilisation de la commande 'find'

La commande 'find' sous Linux aide à localiser des fichiers et des répertoires. Sa syntaxe de base est :

find [chemin] [options] [expression]

Où :

  • [chemin] est le répertoire dans lequel chercher
  • [options] modifient le comportement de la recherche
  • [expression] définit les critères de recherche

Vous pouvez rechercher des fichiers selon :

  • Nom : Utilisez '-name' avec le motif du nom de fichier
  • Type : Utilisez '-type' avec 'f' pour les fichiers ou 'd' pour les répertoires
  • Taille : Utilisez '-size' avec la taille du fichier
  • Date de modification : Utilisez '-mtime' avec le nombre de jours

Par exemple, pour trouver tous les fichiers .txt dans le répertoire actuel et ses sous-répertoires :

find . -name "*.txt"

Conseil: Exclure des répertoires de la recherche

Pour exclure des répertoires spécifiques de votre recherche, utilisez les options '-not' et '-path'. Par exemple, pour trouver tous les fichiers .txt mais exclure le répertoire 'temp' :

find . -name "*.txt" -not -path "./temp/*"

Combiner 'find' avec 'cp' pour la copie

Le chaînage de commandes permet d'utiliser la sortie d'une commande comme entrée pour une autre. En combinant 'find' avec 'cp', vous pouvez localiser et copier des fichiers en une seule étape.

Pour utiliser 'find' et 'cp' ensemble, utilisez l'option '-exec' avec 'find' :

find [chemin] [critères] -exec cp {} [destination] \;

Par exemple, pour trouver tous les fichiers .jpg et les copier dans un dossier 'images' :

find . -name "*.jpg" -exec cp {} ~/images \;

Cette commande recherche les fichiers .jpg dans le répertoire actuel et ses sous-répertoires, puis copie chaque fichier dans le dossier 'images' du répertoire personnel.

Guide étape par étape pour trouver et copier des fichiers de manière récursive

Définir les paramètres de recherche

Pour commencer la recherche de fichiers, définissez le répertoire de recherche. Il peut s'agir d'un chemin spécifique ou du répertoire actuel ('.').

Pour rechercher dans le répertoire /home/utilisateur/documents :

find /home/utilisateur/documents

Ensuite, définissez les critères de correspondance des fichiers. Les critères courants incluent :

  • Nom : Utilisez '-name' avec le motif du nom de fichier entre guillemets
  • Type : Utilisez '-type' avec 'f' pour les fichiers ou 'd' pour les répertoires
  • Taille : Utilisez '-size' avec '+' pour plus grand que ou '-' pour plus petit que, suivi de la taille ('c' pour octets, 'k' pour kilooctets, 'M' pour mégaoctets)

Pour trouver tous les fichiers PDF de plus de 1Mo :

find /home/utilisateur/documents -name "*.pdf" -type f -size +1M

Exécuter l'opération de copie

Pour copier les fichiers trouvés par la commande 'find', utilisez l'option '-exec' avec la commande 'cp'. La structure de base est :

find [répertoire_recherche] [critères] -exec cp {} [répertoire_destination] \;

'{}' représente chaque fichier trouvé par 'find'.

Pour copier tous les fichiers .jpg de /home/utilisateur/images vers /sauvegarde/images tout en conservant la structure de répertoires d'origine, utilisez :

find /home/utilisateur/images -name "*.jpg" -exec cp --parents {} /sauvegarde/images \;

L'option '--parents' avec 'cp' conserve la structure des répertoires. Cela aide à organiser les fichiers et à éviter les conflits de noms dans le répertoire de destination.

Conseil: Utilisez '-print0' pour les noms de fichiers avec des espaces

Si vos noms de fichiers peuvent contenir des espaces, utilisez l'option '-print0' avec 'find' et l'option '-0' avec 'xargs' :

find /home/utilisateur/images -name "*.jpg" -print0 | xargs -0 cp -t /sauvegarde/images

Cela gère correctement les noms de fichiers contenant des espaces.

Exemple: Exclure des répertoires spécifiques

Pour exclure certains répertoires de votre recherche, utilisez les options '-not' et '-path' :

find /home/utilisateur/documents -name "*.txt" -not -path "*/tmp/*" -exec cp {} /sauvegarde/textes \;

Cette commande copie tous les fichiers .txt de /home/utilisateur/documents vers /sauvegarde/textes, en excluant tous les fichiers dans les répertoires nommés 'tmp'.

Considérations supplémentaires pour les opérations sur les fichiers

Gestion des permissions et de la propriété

Lors de la copie de fichiers, vous pouvez rencontrer des problèmes de permissions. Cela peut se produire si vous n'avez pas les droits pour lire les fichiers source ou écrire dans le répertoire de destination. Pour éviter ces problèmes, vous devrez peut-être exécuter la commande de copie avec les privilèges sudo.

Pour conserver les attributs originaux des fichiers, utilisez l'option '-p' avec la commande 'cp'. Voici un exemple :

find /répertoire/source -name "*.txt" -exec cp -p {} /répertoire/destination \;

Cette commande copie tous les fichiers .txt du répertoire source vers le répertoire de destination, en conservant leurs permissions et propriétés d'origine.

Pour un contrôle plus précis des permissions, utilisez l'option '--preserve' avec 'cp' :

find /répertoire/source -name "*.txt" -exec cp --preserve=mode,ownership,timestamps {} /répertoire/destination \;

Cette commande conserve le mode, la propriété et les horodatages des fichiers originaux.

Gestion des noms de fichiers en double

Lors de la copie de fichiers vers un nouvel emplacement, vous pouvez rencontrer des fichiers portant le même nom. Par défaut, la commande 'cp' écrasera les fichiers existants dans le répertoire de destination.

Pour éviter d'écraser les fichiers, utilisez l'option '-n' avec 'cp' :

find /répertoire/source -name "*.txt" -exec cp -n {} /répertoire/destination \;

Cette commande n'écrasera pas les fichiers existants dans le répertoire de destination.

Une autre méthode consiste à ajouter un suffixe aux fichiers copiés. Utilisez l'option '--backup' avec 'cp' :

find /répertoire/source -name "*.txt" -exec cp --backup=numbered {} /répertoire/destination \;

Cette commande ajoute un numéro à la fin de tout nom de fichier en double dans le répertoire de destination.

Vous pouvez également utiliser la commande 'rsync' au lieu de 'cp' pour un meilleur contrôle de la copie des fichiers :

find /répertoire/source -name "*.txt" -print0 | rsync -av --files-from=- --from0 /répertoire/source /répertoire/destination

Cette commande utilise 'rsync' pour copier les fichiers, ce qui permet de gérer les doublons de manière plus flexible et offre des options pour mettre à jour uniquement les fichiers modifiés.

Conseil: Utilisez 'cpio' pour des opérations de copie complexes

Pour des opérations de copie complexes, envisagez d'utiliser la commande 'cpio' :

find /répertoire/source -name "*.txt" -print0 | cpio -pmd0 /répertoire/destination

Cette commande utilise 'cpio' pour copier les fichiers, ce qui peut gérer un grand nombre de fichiers plus efficacement que 'cp'.