Linux-Kopie in Fat32-Dateisystem: ungültiges Argument

12

Wenn ich Dateien von einer ext3-Partition mit cp auf eine fat32-Partition kopiere:

cp -R /ext3/stuff /fat32/partition/

Ich erhalte ungültige Argumentmeldungen für alle Dateien mit Doppelpunkten und Fragezeichen.

Gibt es eine Möglichkeit, cp dazu zu bringen, die ungültigen Zeichen für das Zieldateisystem zu entfernen?

edit: Ich habe noch einmal die Optionen von cp durchgesehen, und wenn ich nicht dumm bin, ist nichts drin. Ich bin mir sicher, dass ich ein Skript schreiben könnte, aber es scheint, dass es eine sauberere Lösung geben sollte!

mo-seph
quelle

Antworten:

10

Die üblichen Verdächtigen, wenn Sie komplexe Kopien oder Umbenennungen wünschen, sind GNU cp, zmv von zsh, rsync und pax (oder cpio). Es gibt keine Umbenennungsfunktion in cp und (glaube ich) nicht in rsync. Zmv kann zwar umbenennen, dies passt jedoch nicht zu rekursiven Kopien. Aber pax kann es schaffen:

cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition

Dies ändert sich jeweils *?:zu _. Achtung: minimal getestet. Bei Kollisionen gewinnt die zuletzt kopierte Datei.

Gilles 'SO - hör auf böse zu sein'
quelle
Nizza - habe noch nie Pax benutzt. Danke, dass du mich dazu gebracht hast.
Montag,
1
Backslash macht auch Probleme mit VFAT. Fügen Sie es auch in den regulären Ausdruck ein. Vielen Dank!
18.
Die vollständige Liste laut support.grouplogic.com/?p=1607 lautet: /? <> \: * | ”^. Es darf auch nicht mit Leerzeichen oder Punkten enden und einige Namen sind reserviert. Die Mtools-Manpage enthält eine noch größere Liste:,; :? + * = [] <> '"\ / |
dhill
Und ein anderer Hinweis und für Leute mit dem gleichen Problem wie ich: pax unterstützt die Verwendung von -s in Kombination mit dem Update-Befehl -u nicht. Dh es werden immer wieder umbenannte Dateien kopiert, auch wenn diese bereits existieren. Ich habe Stunden gebraucht, um das herauszufinden .
Balu
11

Basierend auf einem Beitrag von Gilles habe ich folgende Liste getestet:

#!/bin/sh
touch questionmark?
touch less<
touch less\<
touch more\>
touch backslash\\
touch colon:
touch asterisk\*
touch pipe\|
touch inch\"
touch carret\^
touch comma,
touch semicolon\;
touch plus+
touch equals=
touch lbracket[
touch rbracket]
touch quote\'

Ich habe versucht, das auf Android-Handy MicroSDHC-Karte mit VFAT-Dateisystem zu kopieren und paxBefehl verfeinert, bis alles funktioniert. Für Windows und Unicode reicht das möglicherweise noch nicht aus:

pax -rw -s '/[?<>\\:*|\"]/_/gp' source dest

Möglicherweise möchten Sie auch die Option -k verwenden, um sicherzustellen, dass keine Überschreibungen vorhanden sind (aufgrund von Kollisionen in den Dateinamen). Beide Listen, die ich im Kommentar angegeben habe, unterscheiden sich vom Verhalten von Linux vfat.

dhill
quelle
0

Beim Kopieren mit cp -r source usbstick erhielt ich das Argument "Ungültig" und stellte fest, dass die Ursache ein Quellendateiname ist, der mit einem Leerzeichen endet. Durch Entfernen des Leerzeichens wurde die Nachricht gelöscht. Die Datei mit falschem Namen befand sich in diesem Fall übrigens in Mailer-Programmverzeichnissen.

JohanArnold
quelle
0

Ich hatte gerade Grund, dies zu tun, und obwohl die paxAntwort gut war, stieß sie immer noch auf Probleme mit Zeichen mit Akzenten.

Daher fand ich es einfacher, taralle nicht zulässigen Zeichen durch Unterstriche zu ersetzen:

cd /parent-of-source
tar cf - Söurce | (cd /destination; tar xvf - --transform='s/[^A-Za-z0-9\/ ]/_/g')

Es ist zweifellos möglich, eine bessere Liste der zulässigen Zeichen als die oben angegebene zu erstellen, aber das funktioniert.

MadHatter
quelle
0

Nachdem ich die Antworten auf diese sehr interessante Frage gelesen und mit SD-Karten für Android (exfat) und einem Auto-Unterhaltungssystem (vfat) experimentiert hatte, kam ich zu diesem kleinen Bash-Skript.

#! /bin/bash

DST=$1
# copy music to FAT media

find music/ Music/ -type f | while read f ; do
    d=$DST/$( echo $f | sed 's/[^-A-Za-z0-9/._ ()]/_/g' )

    echo :$d:
    mkdir -p "$(dirname "$d")"
    cp -n "$f" "$d"

done

Es nimmt das Ziel (Mount-Punkt) als Argument und verwendet es find, um alle Dateien in meinem Musik-Repository zu lokalisieren.

Für jeden Dateipfad werden ein Zielpfad und ein Dateiname berechnet, indem das Ziel vorangestellt wird und jedes fehlerhafte Zeichen durch einen Unterstrich ersetzt wird _. Ich benutze eine weiße Liste von Zeichen (Buchstaben, Ziffern, -, /, ., . (, )Und _) jede unerwünschte Zeichensetzung zu entfernen.

Abhängig vom Gebietsschema verbleiben akzentuierte Buchstaben im Pfad und im Dateinamen, was für moderne FAT-Dateisysteme anscheinend in Ordnung ist.

Für jeden Zieldateipfad und -namen werden die Verzeichnisse nach Bedarf mit erstellt mkdir -p. Anschließend wird die Datei kopiert, sofern sie nicht bereits vorhanden ist.

Beachten Sie die Anführungszeichen "an verschiedenen Stellen, damit Pfade und Namen mit Leerzeichen nicht auseinander brechen.

Ber
quelle