Kopieren bestimmter Unterordner mit Verzeichnisstruktur in einen neuen Ordner

8

Ich habe die folgende Verzeichnisstruktur:

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

Ich möchte alle Unterverzeichnisse kopieren ( Subdir1, Subdir2, Subdir3) in einen neuen Ordner. Aber ich möchte nur Ordner fo1und fo2Ordner an der neuen Stelle kopieren .

Ich bin mir nicht sicher, wie ich das machen könnte.

Shan
quelle
Alles kopieren, fo3 löschen?
ChuckCottrill

Antworten:

4

Wenn der Verzeichnisbaum mehr als nur ein Verzeichnis ist, können ..../f03Sie mit diesem rsyncBefehl jedes fo1& kopieren fo2und jedes andere Verzeichnis mit dem Namen ausschließen fo*.

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

Wenn ich mich mit solchen Kopierszenarien beschäftige, verwende ich immer rsyncund es ist --dry-run& --verboseSchalter, damit ich sehen kann, was es tun wird, ohne die Dateien tatsächlich kopieren zu müssen.

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

Beispiel

Probelauf.

$ 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)

Wenn Sie einen Teil der rsyncinternen Logik sehen möchten, was eingeschlossen / ausgeschlossen wird, verwenden Sie den --verboseSchalter.

$ 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)

Wenn Sie andere Arten von Verzeichnissen ausschließen müssen, können Sie mehrere Ausschlüsse hinzufügen.

slm
quelle
3

Verwendung rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
Radu Rădeanu
quelle
0

Sie könnten so etwas versuchen:

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

Der findBefehl gibt alle direkten Unterverzeichnisse von Main_Dir zurück. basenamewird wieder den Namen des Unterverzeichnis (zB basename Main_Dir/Subdir1Erträge Subdir1). Dann verwenden Sie die Shell Klammer Expansion zu vermeiden Eingabe fo1und fo2mehrmals und kopieren Sie sie in das neu erstellte new_dir/$(basename $subdir)Verzeichnis.

In dem speziellen Fall, in dem Sie erwähnen, wo sich nur Verzeichnisse befinden Main_Dirund in dem die Namen keine Leerzeichen oder seltsamen Zeichen enthalten, können Sie das oben Gesagte vereinfachen

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

Wenn Ihre Verzeichnisstruktur genau der in Ihrem Beispiel entspricht (dh alle foDateien befinden sich auf derselben Ebene):

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.
quelle