3 votes

Regex find and copy in bash (en préservant la structure des dossiers) ?

J'ai un dossier contenant plusieurs fichiers journaux. Chaque ensemble de fichiers journaux se trouve dans un dossier détaillant l'heure et la date d'exécution du programme. À l'intérieur de ces dossiers, j'ai des fichiers vidéo que je veux extraire. Je ne veux que les fichiers vidéo, rien d'autre. J'ai essayé d'utiliser cette commande pour copier uniquement les fichiers vidéo, mais cela n'a pas fonctionné car le répertoire n'existait pas.

.rmv est l'extension des fichiers que je souhaite obtenir.

$ find . -regex ".*\.rmv" -type f -exec cp '{}' /copy/to/here/'{}'

Si j'ai une structure de dossier telle que :

|--root  
   |  
   |--folder1  
   |  |  
   |  |--file.rmv  
   |  
   |--folder2  
      |  
      |--file2.rmv  

Comment puis-je faire en sorte que la copie s'effectue dans le répertoire copy/to/here en copiant la structure des dossiers 1 et 2 dans le répertoire de destination ?

12voto

K7g Points 71

Cp a l'argument --parents donc la façon la plus courte de faire ce que vous voulez est :

find root -name '*.rmv' -type f -exec cp --parents "{}" /copy/to/here \;

2voto

Dennis Williamson Points 105818

Je me contenterais d'utiliser rsync .

1voto

martin clayton Points 41306

En {} représente le chemin complet du fichier trouvé, de sorte que votre cp évaluent ce genre de choses :

cp /root/folder1/file.rmv /copy/to/here/root/folder1/file.rmv

Si vous laissez tomber le deuxième {} il s'agira plutôt de

cp /root/folder1/file.rmv /copy/to/here

la forme de copie de fichier à répertoire de cp, qui devrait faire l'affaire.

De même, au lieu de -regex vous pouvez simplement utiliser la fonction -name opérande :

find root -name '*.rmv' -type f -exec cp {} /copy/to/here \;

0voto

RC. Points 18567

Assumer src est votre root y dst est votre /copy/to/here

#!/bin/sh

find . -name *.rmv | while read f
do
       path=$(dirname "$f" | sed -re 's/src(\/)?/dst\1/')
       echo "$f -> $path"
       mkdir -p "$path"
       cp "$f" "$path"
done

mettre en place cp.sh et en cours d'exécution ./cp.sh à partir du répertoire sur Racine

Sortie :

./src/folder1/file.rmv -> ./dst/folder1
./src/My File.rmv -> ./dst
./src/folder2/file2.rmv -> ./dst/folder2

EDIT : version améliorée de script (merci pour le commentaire)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X