ubuntuusers.de

cp und rename, falls Datei exists

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

linuxislife

Anmeldungsdatum:
27. Juni 2021

Beiträge: Zähle...

Hallo zusammen,

ich möchte alle Python-Dateien aus einem Ordner in den aktuellen Ordner kopieren und wenn die eine Datei bereits existiert, soll die neue umbenannt werden. Dazu habe ich den folgenden Befehl:

1
cp -r $(find /home/ -name "*.py") .

Dieser Befehl kopiert zwar alle Dateien, jedoch überschreibt er gleichzeitig die vorhandenen Dateien.

Wie muss ich diesen Befehl modifizieren, sodass die Datei, die kopiert werden soll, umbenannt wird (falls sie natürlich existiert)?

Grüße

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

Du gibst ja auch nicht an wohin die Dateien kopiert werden sollen,

cp quelle.xxx zielordner

oder

cp cp quelle.xxx zielordner/name.xxx

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

linuxislife schrieb:

Hallo zusammen,

ich möchte alle Python-Dateien aus einem Ordner in den aktuellen Ordner kopieren und wenn die eine Datei bereits existiert, soll die neue umbenannt werden. Dazu habe ich den folgenden Befehl:

1
cp -r $(find /home/ -name "*.py") .

Erst mal ist das eine unsichere Art find zu benutzen, insbesondere, wenn Du Dateinamen mit Leerzeichen hast.

Dieser Befehl kopiert zwar alle Dateien, jedoch überschreibt er gleichzeitig die vorhandenen Dateien.

Wie muss ich diesen Befehl modifizieren, sodass die Datei, die kopiert werden soll, umbenannt wird (falls sie natürlich existiert)?

Du musst jede Datei einzeln anschauen. Also, vielleicht so etwas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
export TARGET=/abc
export TS=$(date '+%Y-%m-%d_%H:%M:%S')

find ~ -type f -name \*.py -exec sh -c '
for f; do
  bn="${f##*/}"

  if [ -e "$TARGET/$bn" ]; then
    bn="$bn.$TS"
  fi

  cp -a "$f" "$TARGET/$bn"
done
' -- {} +

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

Man sollte auch bedenken das in /home py-Dateien sind die man besser nicht umbenennen sollte.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

Axel-Erfurt schrieb:

Man sollte auch bedenken das in /home py-Dateien sind die man besser nicht umbenennen sollte.

Naja, es sollen ja die Dubletten am Zielort umbenannt werden. Aber trotzdem ein guter Hinweis. Vielleicht hätten wir erst mal fragen sollen, wozu das ganze eigentlich dient.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

Vielleicht sowas in der Art:

#!/usr/bin/env python3
import argparse
import pathlib
from typing import Iterator
import shutil

parser = argparse.ArgumentParser(description='copy files, but instead of overwriting, add a counter')
parser.add_argument('source', metavar='SOURCE_DIR', type=str,
                    help='source directory')
parser.add_argument('target', metavar='TARGET_DIR', type=str,
                    help='copy the files to this directory')
parser.add_argument('-g' '--glob', dest='glob_expression', default='*.py',
                    help='extension of the files to copy')
args = parser.parse_args()


def generate_names(filename: pathlib.Path) -> Iterator[str]:
    yield filename.name
    n = 1
    while True:
        yield f"{filename.stem}_{n:04d}{filename.suffix}"
        n += 1


target = pathlib.Path(args.target)
for element in pathlib.Path(args.source).glob(args.glob_expression):
    if not element.is_file():
        continue
    for filename in generate_names(element):
        target_file = target / filename
        if not (target_file).exists():
            break
    shutil.copy2(element, target_file 

linuxislife

(Themenstarter)

Anmeldungsdatum:
27. Juni 2021

Beiträge: 2

Hallo zusammen, es tut mir sehr leid, dass ich so spät antworte. Ich habe leider sehr viel zu tun gehabt. Danke euch für die Antworten. Ich werde eure Lösungen so schnell wie möglich testen und diese Thread als gelöst markieren.

Antworten |