ubuntuusers.de

Kopieren von ext4 auf exFAT

Status: Gelöst | Ubuntu-Version: Kubuntu 25.10 (Questing Quokka)
Antworten |

ftomasch

Anmeldungsdatum:
11. Februar 2020

Beiträge: 211

Hallo! Ich möchte eine recht großes Bildersammlung, ca. 60GB, aus einem Kubuntu-Verzeichnis, das in ext4 formatiert ist, auf einen mit exFAT Usb-Stick kopieren. Die Bilder möchte ich dann auf einem Android Smartphone aufrufen und anschauen.

Mein Problem: Viele Datein werden nicht kopiert.ExFat kann leider nicht sämtliche Zeichen in einem Dateinamen verarbeiten als es mit dem modernern ext4 möglich ist.

Folgendes habe ich ausprobiert:

1. Dateien im Dateimanager "direkt" kopiert. Es taucht ein Kontrollfeld auf in dem ich eingestellt habe, dass die in ExFat nicht lesbaren Zeichen ersetzt werden sollen. Ergebnis: Sämtliche Ordner der obersten Ebenen wurden kopiert. Die sind jedoch komplett leer!

2. RSYNC - funktioniert wesentlich besser. Immerhin ca. 80% der Dateien werden kopiert. Die Anweisung dafür lautet:

sudo rsync -avEP --progress  --stats  "/media/Festplatte - ext4" "/media/USB_Stick - ExFat"

Gibt es eine Möglichkeit die restlichen 20% der Dateien automatisiert zu kopieren. Wie der Dateiname dann auf dem USB-Stick aussieht ist unerheblich...

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 7959

Solche Dinge erledige ich mit >> FreeFileSync <<.

ftomasch

(Themenstarter)

Anmeldungsdatum:
11. Februar 2020

Beiträge: 211

Hallo Schwarzheit!

FreeFileSync habe ich ausprobiert. Leider kam die Fehlerldung

Das Verzeichnis "/media/xxx/exFAT/Archiv Bildende Kunst/- Expressionismus | DADA" kann nicht erstellt werden.

EINVAL: Das Argument ist ungültig [mkdir]

Die Ursprungsdateien befinden sich auf einer NVMe mit ext4 formatiert. Das Zeil ist ein USB-Stick mit exFat. Wo liegt der Fehler?

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 7959

Das Zeichen | (Pipe) ist auf exFat unzulässig.

Überhaupt würde ich Leerzeichen und Sonderzeichen im Verzeichnispfad und Dateinamen weg lassen.

Vielleicht solltest du erstmal Verzeichnispfade und Dateinamen bereinigen. Das würde solche Probleme verhindern.

timothy2068

Anmeldungsdatum:
10. März 2025

Beiträge: 330

Anderer Ansatz: Wenn dir der Dateiname auf dem Stick egal ist, dann speicher die Dateien doch generell unter Zufallsnamen oder sonstwas ab.

Skripte für so was kannst du dir von Chatbots bauen lassen, das hier gab mir Le Chat aus, ungetestet:

#!/bin/bash

# Quellverzeichnis (HDD)
QUELLE="/pfad/zu/deinem/quellverzeichnis"

# Zielverzeichnis (USB-Stick)
ZIEL="/pfad/zu/deinem/usb-stick"

# Prüfen, ob das Zielverzeichnis existiert
if [ ! -d "$ZIEL" ]; then
    echo "Fehler: Zielverzeichnis existiert nicht."
    exit 1
fi

# Funktion zum Generieren eines zufälligen Namens
zufaelliger_name() {
    cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
}

# Funktion zum rekursiven Kopieren mit zufälligen Namen
kopiere_mit_zufallsnamen() {
    local quell_pfad="$1"
    local ziel_pfad="$2"
    local basis_name=$(basename "$quell_pfad")

    # Wenn es ein Verzeichnis ist
    if [ -d "$quell_pfad" ]; then
        # Zufälligen Ordnernamen generieren
        local neuer_ordner_name="$(zufaelliger_name)"
        local neues_ziel="$ziel_pfad/$neuer_ordner_name"

        # Zielordner erstellen
        mkdir -p "$neues_ziel"
        echo "Erstellt: $quell_pfad -> $neues_ziel"

        # Rekursiv alle Inhalte kopieren
        for element in "$quell_pfad"/*; do
            kopiere_mit_zufallsnamen "$element" "$neues_ziel"
        done
    # Wenn es eine Datei ist
    elif [ -f "$quell_pfad" ]; then
        # Dateiendung extrahieren
        local endung="${quell_pfad##*.}"
        endung="${endung##*/}" # Falls der Pfad Slashes enthält
        # Zufälligen Dateinamen generieren
        local neuer_datei_name="$(zufaelliger_name).${endung}"
        # Datei kopieren
        cp "$quell_pfad" "$ziel_pfad/$neuer_datei_name"
        echo "Kopiert: $quell_pfad -> $ziel_pfad/$neuer_datei_name"
    fi
}

# Rekursives Kopieren starten
kopiere_mit_zufallsnamen "$QUELLE" "$ZIEL"

echo "Fertig! Alle Dateien und Ordner wurden kopiert."

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 7959

Ich würd das gleich in der Quelle bereinigen.

find /pfad/zum/verzeichnis -depth -exec rename 's#[\\/:*?"<>|]##g' -n {} +

Entfernt alle unzulässigen Zeichen gilt rekursiv für Dateien und Verzeichnisse..

Wenn das was angezeigt wird ok ist dann das -n entfernen. -n steht hier für eine Simulation.

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 897

Ausprobiert hast du deinen Befehl scheinbar nicht, denn so funktioniert das nicht:

1
2
3
4
5
6
7
8
$ ls -A /tmp/ren
'1<'  '1>'  '1|'
$ find /tmp/ren -depth -exec rename 's#[\\/:*?"<>|]##g' -n {} +
/tmp/ren/1> not renamed: tmpren1 already exists
/tmp/ren/1| not renamed: tmpren1 already exists
Can't rename /tmp/ren tmpren: Invalid argument
$ ls -A /tmp/ren
'1>'  '1|'   tmpren1

Gruß TNT

ftomasch

(Themenstarter)

Anmeldungsdatum:
11. Februar 2020

Beiträge: 211

OK, alles klar! Vielen Dank für die Infos!

Antworten |