Copie de sous-dossiers spécifiques avec une structure de répertoires dans un nouveau dossier


8

J'ai une structure de répertoires suivante:

                Main_Dir
                   |
  -----------------------------------
  Subdir1       Subdir2       Subdir3
     |             |             |
 ---------     ---------     ---------
 |   |   |     |   |   |     |   |   |            
fo1 fo2 f03   fo1 fo2 f03   fo1 fo2 f03

Je veux copier tous les sous - répertoires ( Subdir1, Subdir2, Subdir3) dans un nouveau dossier. Mais je veux seulement copier fo1et fo2dossiers dans le nouvel endroit.

Je ne sais pas comment cela pourrait être fait.


Tout copier, supprimer fo3?
ChuckCottrill

Réponses:


4

Si l'arborescence des répertoires est plus que juste, ..../f03vous pouvez utiliser cette rsynccommande pour copier tous les fo1& fo2et exclure tous les autres répertoires portant le nom fo*.

$ rsync -avz --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Lorsque vous traitez avec ces types de scénarios de copie que je fais toujours l' utilisation de rsyncet il est --dry-runet --verbosecommute donc je peux voir ce qu'il va faire , sans avoir à copier les fichiers.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Exemple

Course à sec.

$ rsync -avz --dry-run --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.
sending incremental file list
./

Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Si vous voulez voir une partie de rsyncla logique interne de ce qui est inclus / exclu, utilisez le --verbosecommutateur.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

sending incremental file list
[sender] showing directory Subdir1/fo2 because of pattern fo[12]/
[sender] showing directory Subdir1/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir1/fo3 because of pattern fo*/
[sender] showing directory Subdir2/fo2 because of pattern fo[12]/
[sender] showing directory Subdir2/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir2/fo3 because of pattern fo*/
[sender] showing directory Subdir3/fo2 because of pattern fo[12]/
[sender] showing directory Subdir3/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir3/fo3 because of pattern fo*/
delta-transmission disabled for local transfer or --whole-file
./
Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Si vous devez exclure d'autres formes de répertoires, vous pouvez ajouter plusieurs exclusions.


3

Utilisation rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination

0

Vous pouvez essayer quelque chose comme ceci:

find Main_Dir -maxdepth 1 -mindepth 1 -type d | while IFS= read -r subdir; do
   mkdir -p new_dir/"$(basename $subdir)" && 
   cp -r "$subdir"/{fo1,fo2} new_dir/"$(basename $subdir)"/; 
done

La findcommande renvoie tous les sous-répertoires directs de Main_Dir. basenamerenverra le nom du sous-répertoire trouvé (par exemple, basename Main_Dir/Subdir1retours Subdir1). Vous utilisez ensuite de la coquille d'expansion de croisillon pour taper éviter fo1et à fo2plusieurs reprises et les copier dans le nouveau new_dir/$(basename $subdir)répertoire.

Dans le cas spécifique où vous mentionnez où il n'y a que des répertoires sous Main_Diret où il n'y a pas d'espaces ou de caractères étranges dans les noms, vous pouvez simplifier ce qui précède pour

cd Main_Dir; for subdir in *; do 
  mkdir -p ../new_dir/$subdir && cp -rv $subdir/{fo1,fo2} ../new_dir/$subdir; 
done

0

Si la structure de votre répertoire est exactement comme dans votre exemple (c'est-à-dire que tous les fofichiers sont au même niveau):

mkdir -p New_Dir/{Subdir1,Subdir2,Subdir3}
for subdir in Subdir1 Subdir2 Subdir3;do
    cp -r Main_Dir/"$dir"/{fo1,fo2} New_Dir/"$dir"/
done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.