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.

Shan
la source
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.

slm
la source
3

Utilisation rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
Radu Rădeanu
la source
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
terdon
la source
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
Joseph R.
la source