web-dev-qa-db-fra.com

Comment déplacer des fichiers hors des sous-répertoires avec l'extension donnée de manière récursive dans un dossier de destination?

Je souhaite déplacer tous les fichiers *.txt de tous les sous-répertoires situés dans un répertoire donné vers un répertoire de destination.

En procédant comme ci-dessous, il déplace TOUS les fichiers - comment puis-je le réduire à tous les fichiers *.txt uniquement?

find -type f -print0|xargs -0r mv -it "/path to my folder/destination-directory"
9
Middi

Utilisez un motif global avec l’option -name de find pour indiquer le motif souhaité, *.txt dans votre cas:

find . -type f -name '*.txt' -exec mv -t /destination {} +

Bien sûr, remplacez /destination par le répertoire de destination actuel.

Notes:

  • Il n'est pas nécessaire de générer xargs et un canal anonyme. Utilisez la logique mv dans le prédicat -exec de find.

  • find ... -exec gère tous les types de noms de fichiers possibles et ARG_MAX ainsi

  • GNU mv (par défaut sous Ubuntu) a -t pour prendre un répertoire de destination, afin que vous puissiez utiliser l'argument + de -exec pour envoyer tous les fichiers en une seule exécution de mv (ou au moins une exécution minimale si ARG_MAX est déclenché dans le processus)

11
heemayl

Ajouter un test -name

find -type f -name "*.txt" -print0 |...

N'oubliez pas de citer le glob pour empêcher les extensions de Shell.

Pour une recherche insensible à la casse, utilisez -iname au lieu de -name.

6
Zanna
find /folder/ -type f -name "*.txt" -exec mv {} /other/folder/ \;

J'ai testé cela, fonctionne bien.

3
Seth

En utilisant votre commande d'origine:

find . -type f -name "*.txt" -print0|xargs -0r mv -it /path/to/destination

Info:

  1. .: recherche à l'emplacement actuel

  2. "*.txt": fichiers portant l'extension .txt dans leurs noms

2
George Udosen