ubuntuusers.de

Nur nicht-existierende Ordner kopieren

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

leof.

Anmeldungsdatum:
8. Februar 2007

Beiträge: 309

Wohnort: Ettlingen

Hallo,

Folgendes Szenario: Ich lege folgende Ordnerstruktur an:

Ordner1
├── A11
│   ├── AU1
│   └── AU2
├── A12
│  ├── AU1
│  └── AU2
└── A13

Ordner2
├── A11
│   ├── AU1
│   └── AU2
└── A12

Wie schaffe ich es, dann aus Ordner1 NUR der Ordner A13 nach Ordner2 kopiert wird, da er ja der einzige Ordner ist, der in Ordner2 noch nicht existiert. Es sollen also nur die Ordner mit samt dem Inhalt kopiert werden, die noch NICHT im Ordner2 enhalten sind (unabhängig davon, ob die Inhalte der bereits existierenden Ordner gleich sind).

Hat hierfür jemand eine Lösung? rsync --ignore-existing und cp -n brachen mich nicht zum Erfolg... DANKE

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11248

Wohnort: München

Das sollte z.B. so gehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env python3
import shutil
import sys

from pathlib import Path

try:
    origin, destination = (Path(p) for p in sys.argv[1:])
except Exception:
    sys.exit(f"usage: {sys.argv[0]} ORIGIN DESTINATION")

exist_in_destination = set((p.name for p in destination.iterdir() if p.is_dir()))
for p in origin.iterdir():
    if not p.is_dir() or p.name in exist_in_destination:
        continue
    destination = shutil.copytree(d, destination / d.name)

Aufgerufen wird das ausführbar gemachte Skript dann mit dem Quell- und dem Zielordner, also z.B.:

./copy_dirs.py Ordner1 Ordner2 

leof.

(Themenstarter)

Anmeldungsdatum:
8. Februar 2007

Beiträge: 309

Wohnort: Ettlingen

Hallo Seahawk,

danke! Die letzte Zeile wollte bei mir nicht. Habe es zum Anlass genommen um mich mal in pathlib einzulesen 😉

Vielleicht ist ja noch jemandem von nutzen. Ich kopiere beim Nextcloud-Update die fehlenden Apps von der alten Version in die Neue...

Warum wolltest du den copytree-Befehl einer Variablen zuweisen? Kannst du mir das noch erklären? Oder war das ein Versehen?

Vielen Dank!!!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python3
import shutil
import sys

from pathlib import Path

from argparse import ArgumentParser
parser = ArgumentParser(description = "Fehlende Verzeichnisse kopieren")
parser.add_argument("-n", "--notest", action="store_true", dest="notest", default="", help="Ordner tatsächlich kopieren")
parser.add_argument("origin", type=str, help="Quellverzeichnis") 
parser.add_argument("destination", type=str, help="Zielverzeichnis") 

args = parser.parse_args()
print(args)
#print(args)

try:
    origin = Path(args.origin)
    destination = Path(args.destination) 
except Exception:
    sys.exit(f"usage: {sys.argv[0]} ORIGIN DESTINATION")

folders_in_destination = set((p.name for p in destination.iterdir() if p.is_dir()))
print(origin.iterdir())

#für jedes Verzeichnis im Ursprungsordner
for p in origin.iterdir():
    #Wenn es ein Verzeichnis ist und das Verzeichnis nict schon existiert
    if p.is_dir() and not p.name in folders_in_destination:

        #wird kopiert, wenn --notest gewählt wurde
        if args.notest:
            shutil.copytree(p, destination / p.name)
            print("Wurde kopiert:", p.name)
        else:
            print("TESTLAUF: würde kopiert werden:",p.name)

    else:
        print("Ist vorhanden:",p.name)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11248

Wohnort: München

leof. schrieb:

Hallo Seahawk,

danke! Die letzte Zeile wollte bei mir nicht. Habe es zum Anlass genommen um mich mal in pathlib einzulesen 😉

Ups, da hätte das d ein p sei sollen und die Zuweisung ist natürlich auch unsinnig - das sollte eigentlich so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
import shutil
import sys

from pathlib import Path

try:
    origin, destination = (Path(p) for p in sys.argv[1:])
except Exception:
    sys.exit(f"usage: {sys.argv[0]} ORIGIN DESTINATION")


exist_in_destination = set((x.name for x in destination.iterdir() if x.is_dir()))
for p in origin.iterdir():
    if not p.is_dir():
        continue
    if p.name in exist_in_destination:
        continue
    shutil.copytree(p, destination / p.name)

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Ordnerstruktur:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
.
├── o1
│   ├── a11
│      ├── au1
│      └── au2
│   ├── a12
│      ├── au1
│      └── au2
│   └── a13
│       ├── au1
│       └── au2
└── o2
    ├── a11
       ├── au1
       └── au2
    └── a12

Befehl:

1
2
3
4
for o in o1/* 
do
    test ! -e o2/$(basename $o) && echo fehlt $o 
done

Output

1
fehlt o1/a13

Statt echo im Script einen geeigneten Kopierbefehl wählen.

Antworten |