Um Dateien mit doppelten Namen zu verschieben und beide Kopien zu behalten, geben Sie jeder eingehenden Datei einen unbenutzten Zielnamen, bevor Sie sie verschieben. Diese Anleitung erstellt einen Mac-Kurzbefehl, der nummerierte Suffixe hinzufügt, wobei wegwerfbare Textdateien verwendet werden, um das Ergebnis zu demonstrieren.

Die Aufgabe besteht darin, gewöhnliche Dateien von einem lokalen Ordner in einen anderen zu verschieben, der bereits übereinstimmende Namen enthalten kann. Die vorhandenen Dateien im Ziel bleiben an Ort und Stelle; eingehende Dateien erhalten Namen wie notes (2).txt. Beide behalten bedeutet, dass beide Dateien nach dem Verschieben im Ziel verbleiben – die eingehende Datei verbleibt nicht mehr in ihrem Quellordner.

Was dokumentiert Apple zum Behalten beider Dateien?

Apple dokumentiert die Unterstützung für die direkte Ausführung von Shell-Skripten in Shortcuts. Die öffentlichen Shortcuts-Seiten, die hier zitiert werden, geben keine Keep Both-Kollisionsrichtlinie für die Aktion Datei verschieben an. Anstatt sich auf eine undokumentierte Einstellung zu verlassen, trifft dieser Workflow die Benennungsentscheidung explizit in Shell-Skript ausführen. Apple beschreibt die Skriptfähigkeit in Shortcuts für macOS kennenlernen.

Der zugrunde liegende macOS-Befehl hat ein engeres dokumentiertes Verhalten: mv -n überschreibt eine vorhandene Datei nicht. Er generiert keinen neuen Namen. Daher benötigt dieser Kurzbefehl sowohl eine Dateinamen-Auswahlschleife als auch die No-Overwrite-Option. Dies sind getrennte Verantwortlichkeiten, wie in Apples veröffentlichtem mv(1) Handbuch-Quelltext gezeigt.

Auch das Zusammenführen von Ordnern im Finder hat Grenzen. Apple sagt, dass Zusammenführen nur erscheint, wenn ein Ordner Elemente enthält, die im anderen fehlen; Ordner, die unterschiedliche Versionen identisch benannter Dateien enthalten, bieten Abbrechen oder Ersetzen. Das Zusammenführen von Ordnern bietet daher nicht das benötigte nummerierte Datei-Verhalten. Siehe Dateien in Ordnern auf dem Mac organisieren.

Wegwerfbares Duplicate-Name-Beispiel vorbereiten

Verwenden Sie dieses Beispiel mit zwei Ordnern auf demselben lokalen Laufwerk. Es verarbeitet gewöhnliche, nicht versteckte Dateien direkt im Quellordner. Es verarbeitet keine Unterordner rekursiv, verschiebt keine Aliase oder symbolischen Links und führt keine Paketzusammenführung durch. Führen Sie jeweils eine Instanz aus, wobei kein Ordner von einem anderen Prozess geändert wird.

Der Kurzbefehl erfordert, dass Shell-Skript ausführen auf Ihrem Mac verfügbar und ausführbar ist. Wenn diese Aktion in Ihrer Einrichtung nicht ausgeführt werden kann, verwenden Sie das Finder-Verfahren später in diesem Artikel. Die untenstehenden Beispiele erfordern keine zusätzliche Software.

Öffnen Sie das Terminal und fügen Sie diesen vollständigen Einrichtungsbefehl ein. Er erstellt einen neuen Schreibtisch-Ordner, der nur synthetischen Text enthält. Wenn Shortcuts-name-demo bereits existiert, bricht der Befehl ab, anstatt dessen Inhalt wiederzuverwenden.

/bin/bash <<'BASH'
set -e
root="$HOME/Desktop/Shortcuts-name-demo"
/bin/mkdir "$root"
/bin/mkdir "$root/Incoming" "$root/Collected"
printf '%s\n' 'Incoming synthetic notes.' > "$root/Incoming/notes.txt"
printf '%s\n' 'Existing synthetic notes.' > "$root/Collected/notes.txt"
printf '%s\n' 'Earlier synthetic second copy.' > "$root/Collected/notes (2).txt"
printf '%s\n' 'Synthetic readme.' > "$root/Incoming/readme.txt"
printf 'Example folder: %s\n' "$root"
BASH

Die Kollision ist beabsichtigt: Das Ziel enthält bereits sowohl notes.txt als auch notes (2).txt. Ein Kurzbefehl, der lediglich (2) anhängt, würde auf eine weitere Kollision stoßen. Die nützliche Entscheidungsregel besteht darin, aufeinanderfolgende Kandidaten zu testen, bis ein Name verfügbar ist.

Zur leichteren Inspektion aktivieren Sie Alle Dateinamenerweiterungen anzeigen unter Finder > Einstellungen > Erweitert. Apple erklärt, dass das Ausblenden einer Erweiterung nur die Anzeige ändert, während das Ändern der Erweiterung selbst beeinflussen kann, welche App die Datei öffnet. Behalten Sie .txt in diesem Beispiel bei. Siehe Dateinamenerweiterungen auf dem Mac ein- oder ausblenden.

Kurzbefehl mit expliziter Kollisionsbehandlung erstellen

Erstellen Sie einen Kurzbefehl mit dem Hinzufügen-Button in Shortcuts und nennen Sie ihn Dateien verschieben und beide behalten. Suchen Sie Shell-Skript ausführen in der Aktionenbibliothek und fügen Sie es hinzu. Apple dokumentiert das Erstellen von Kurzbefehlen und das Hinzufügen von Aktionen in Einen benutzerdefinierten Kurzbefehl auf dem Mac erstellen.

Legen Sie die Shell der Aktion auf /bin/bash fest und ersetzen Sie das Beispielskript durch das untenstehende vollständige Programm. Diese Version liest die beiden Ordnerpfade aus Variablen im Skript. Sie verwendet keine Kurzbefehlseingabe, ausgewählte Finder-Objekte oder Standardeingabe, daher ist die Eingabeweitergabe-Einstellung unerheblich.

set -e
shopt -s nullglob

src_dir="$HOME/Desktop/Shortcuts-name-demo/Incoming"
dst_dir="$HOME/Desktop/Shortcuts-name-demo/Collected"

fail() {
    printf '%s\n' "$1" >&2
    exit 1
}

[[ -d "$src_dir" ]] || fail "Source folder does not exist."
[[ -d "$dst_dir" ]] || fail "Destination folder does not exist."

src_dir=$(cd "$src_dir" && pwd -P)
dst_dir=$(cd "$dst_dir" && pwd -P)
[[ "$src_dir" != "$dst_dir" ]] || fail "Choose different folders."

moved=0
for src in "$src_dir"/*; do
    if [[ -L "$src" || ! -f "$src" ]]; then
        printf 'Skipped non-regular item: %s\n' "$src" >&2
        continue
    fi

    name=${src##*/}
    stem=$name
    ext=
    if [[ "$name" == *.* && "$name" != .* && "$name" != *. ]]; then
        stem=${name%.*}
        ext=.${name##*.}
    fi

    target="$dst_dir/$name"
    number=2
    while [[ -e "$target" || -L "$target" ]]; do
        target="$dst_dir/$stem ($number)$ext"
        number=$((number + 1))
    done

    /bin/mv -n "$src" "$target" || fail "Move failed: $src"
    if [[ -e "$src" || -L "$src" || ! -f "$target" ]]; then
        fail "Move was not completed as expected: $src"
    fi

    moved=$((moved + 1))
    printf 'Moved: %s -> %s\n' "$name" "${target##*/}"
done
printf 'Completed: %s file(s) moved.\n' "$moved"

Fügen Sie Schnellansicht nach der Skriptaktion hinzu, um den Bericht zu prüfen. Apple empfiehlt speziell, Schnellansicht während des Testens einzufügen, um zu sehen, welcher Inhalt zwischen den Aktionen fließt. Siehe Aktionen in Shortcuts auf dem Mac testen.

Der Bericht enthält Text, der abgeschlossene Verschiebungen beschreibt. Er ist keine Liste verschobener Datei-Objekte. Wenn Sie den Kurzbefehl später erweitern, behandeln Sie diese Berichtszeilen nicht als Dateieingabe. Apple dokumentiert, dass Aktionen bestimmte Inhaltstypen akzeptieren und erzeugen; verwenden Sie Info anzeigen auf einer Aktion, um ihre akzeptierte Eingabe und resultierende Ausgabe zu prüfen. Siehe Aktionsverbindungen in Shortcuts auf dem Mac.

Wie bewahrt die Benennungsregel beide Kopien?

Für jede Quelldatei prüft das Skript zuerst den ursprünglichen Zielpfad. Wenn dieser Pfad belegt ist, versucht es (2), dann (3), fortlaufend, bis ein Kandidat unbenutzt ist. Vorhandene Verzeichnisse und symbolische Links zählen ebenfalls als belegte Namen. Der finale Verschiebevorgang verwendet mv -n als zusätzliche No-Overwrite-Prüfung, gemäß Apples mv(1) Dokumentation.

Eingehende Datei Ziel enthält bereits Gewählter Zielname
notes.txt Nichts mit diesem Namen notes.txt
notes.txt notes.txt notes (2).txt
notes.txt notes.txt, notes (2).txt notes (3).txt
readme readme readme (2)
archive.tar.gz archive.tar.gz archive.tar (2).gz

Dies sind die Benennungsregeln des Programms, nicht eine Behauptung über die automatische Benennung des Finders. Nur die letzte Erweiterung wird getrennt: .gz bleibt am Ende von archive.tar (2).gz. Eine eingehende Datei, die bereits notes (2).txt heißt, behält diesen Stamm bei und erzeugt notes (2) (2).txt, falls notwendig. Das Skript interpretiert eine vorhandene Zahl nicht als Version.

Das Programm setzt Pfade in Anführungszeichen und iteriert über shell-erweiterte Dateinamen, anstatt eine Textauflistung zu splitten. Namen mit Leerzeichen bleiben somit einzelne Elemente. Die Syntax verwendet bewusst Bash; behalten Sie /bin/bash ausgewählt. Apples Shell Script Basics erklärt, warum Shell-Dialekt-Unterschiede wichtig sind.

Beispiel ausführen und Ergebnis prüfen

Führen Sie den Kurzbefehl einmal aus und prüfen Sie dann beide Ordner im Finder. Für die bereitgestellten synthetischen Daten sind die erwarteten Zielinhalte:

  • notes.txt, immer noch mit Existing synthetic notes.
  • notes (2).txt, immer noch mit Earlier synthetic second copy.
  • notes (3).txt, mit Incoming synthetic notes.
  • readme.txt, mit Synthetic readme.

Der Ordner Incoming sollte nun leer sein, und der Bericht sollte mit Completed: 2 file(s) moved. enden. Ein erneutes Ausführen des Kurzbefehls ohne Hinzufügen von Dateien sollte null Verschiebungen melden. Dies sind die erwarteten Ergebnisse für das Beispiel; der vollständige macOS Shortcuts-Workflow wurde bei der Erstellung dieses Artikels nicht ausgeführt. Die Dateinamen-Aufteilungsausdrücke wurden separat mit synthetischen Namen geprüft.

Wenn der Kurzbefehl stoppt, prüfen Sie beide Ordner, bevor Sie ihn erneut ausführen. Jede Datei wird einzeln verschoben, sodass ein Fehler bei einer späteren Datei frühere Verschiebungen nicht rückgängig macht. Das Skript prüft, ob die Quelle nach jedem Befehl noch vorhanden ist, anstatt anzunehmen, dass jeder Befehlsabschluss eine Verschiebung bedeutet.

Bei einem gewöhnlichen Verschiebe-Fehler empfiehlt Apple zu prüfen, ob die Datei geöffnet ist und ob das Ziel über genügend freien Speicherplatz verfügt. Siehe Wenn Sie ein Objekt auf dem Mac nicht verschieben oder kopieren können. Ein Dateiname, der nach Hinzufügen eines Suffixes zu lang wird, kann auch verhindern, dass dieses Programm diesen Verschiebevorgang abschließt; es stoppt, anstatt den Namen abzuschneiden.

Die Existenzprüfung und der Verschiebevorgang sind separate Operationen. Dieses Programm ist für einen einzelnen, manuell ausgeführten lokalen Workflow mit stabilen Ordnern gedacht. Es reserviert keine Kandidatennamen gegen gleichzeitige Änderungen. Halten Sie gleichzeitige Ausführungen und andere Schreiber von den Beispielordnern fern.

Finder verwenden, wenn Sie nur wenige Kollisionen haben

Für einen kleinen Stapel benennen Sie die eingehende Datei explizit um, bevor Sie sie verschieben. Im synthetischen Beispiel inspizieren Sie Collected, wählen Incoming/notes.txt, drücken Return, geben notes (3).txt ein und drücken erneut Return. Apple dokumentiert dieses Umbenennungsverfahren in Dateien, Ordner und Volumes auf dem Mac umbenennen.

Ziehen Sie die umbenannte Datei dann in Collected auf demselben Laufwerk. Apple dokumentiert das Ziehen eines Objekts in einen Ordner, um es zu verschieben, das Halten von Option, um es zu kopieren, und das Halten von Befehl beim Ziehen auf ein anderes Laufwerk, um es zu verschieben. Siehe Dateien in Ordnern auf dem Mac organisieren. Wenn ein weiterer Namenskonflikt auftritt, brechen Sie diese Übertragung ab und wählen einen anderen unbenutzten Namen.

Sobald das wegwerfbare Beispiel wie erwartet auf Ihrem Mac funktioniert, passen Sie nur src_dir und dst_dir für ein anderes Paar lokaler Ordner mit denselben Bedingungen an. Behalten Sie die nummerierte-Namen-Schleife und die Abschlussprüfungen zusammen: Die Wahl eines unbenutzten Namens bewahrt beide Zielkopien, während die Ergebnisprüfung Ihnen sagt, ob die eingehende Datei tatsächlich verschoben wurde.

Quellen