Copia Linux in filesystem fat32: argomento non valido


12

Quando copio file da una partizione ext3 a uno fat32 usando cp:

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

Ottengo messaggi di argomenti non validi per tutti i file con due punti e punti interrogativi in.

C'è un modo per ottenere cp per rimuovere i caratteri non validi per il filesystem di destinazione?

modifica: ho controllato di nuovo le opzioni di cp e, a meno che non sia stupido, non c'è niente lì dentro. Sono sicuro di poter scrivere una sceneggiatura, ma sembra che ci dovrebbe essere una soluzione più pulita!

Risposte:


10

I soliti sospetti quando si vogliono copiare o rinominare complessi sono GNU cp, zmv da zsh, rsync e pax (o cpio). Non c'è alcuna funzionalità di rinomina in cp, né (credo) in rsync. Sebbene zmv possa rinominare, questo non si adatta bene alle copie ricorsive. Ma pax può farlo:

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

Questo cambia ciascuno *?: a _. Attenzione: minimamente testato. Se ci sono collisioni, il file che viene copiato per ultimo vince.


Bello - non ho mai usato la pax. Grazie per avermi messo in pratica.
mo-seph

1
Anche il backslash crea problemi a vfat. Includilo anche nella regexp. Grazie!
lzap

La lista completa secondo support.grouplogic.com/?p=1607 è: /? & Lt; & Gt; \: * | "^. Inoltre non può terminare con lo spazio o il punto e alcuni nomi sono riservati. La manpage di Mtools fornisce una lista ancora più grande:,; :? + * = [] & lt; & Gt; '"\ / |
dhill

E una nota diversa e per le persone che hanno lo stesso problema di me: pax non supporta l'uso di -s in combinazione con il comando di aggiornamento -u. Cioè copierà sempre i file rinominati anche se già esistono. Mi ci sono volute ore scoprire riguardo a questo.
balu

10

Sulla base del post di Gilles ho testato il seguente elenco:

#!/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\'

Ho provato a copiarlo sulla scheda MicroSDHC del telefono Android con file system vfat e raffinato pax comando fino a quando tutto ha funzionato. Potrebbe non essere ancora sufficiente per Windows e Unicode:

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

Potresti anche voler usare l'opzione -k per assicurarti che non ci siano sovrascritture (a causa di collisioni nei nomi dei file). Entrambe le liste che ho fornito nel commento erano diverse dal comportamento di Linux vfat.


0

Ho ricevuto l '"argomento non valido" durante la copia con cp -r source usbstick e ho scoperto che la causa era un sourcefilename che termina con uno spazio. Rimozione dello spazio cancellato il messaggio. In questo caso, il file con il nome errato si trovava nelle directory del programma di posta.


0

Ho appena avuto bisogno di fare questo, e mentre il pax La risposta basata su una base era buona, ma presentava ancora problemi con caratteri accentati.

Quindi ho trovato più semplice da usare tar e fallo sostituire tutti i caratteri non consentiti con caratteri di sottolineatura:

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

È senza dubbio possibile trovare una lista migliore di personaggi consentiti rispetto a quella sopra, ma questo funziona.


0

Dopo aver letto le risposte a questa domanda molto interessante e aver fatto alcuni esperimenti con la scheda SD per Android (exfat) e un sistema di intrattenimento per auto (vfat), mi sono imbattuto in questo piccolo script bash.

#! /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

Prende la destinazione (punto di mount) come argomento e usa find per trovare tutti i file nel mio repository musicale.

Per ogni percorso del file, calcola un percorso di destinazione e il nome del file anteponendo la destinazione e sostituendo qualsiasi carattere incriminato con un trattino basso _. Uso una lista bianca di caratteri (lettere, cifre, -, /, ., . (, ) e _ ) per rimuovere eventuali segni di punteggiatura indesiderati.

A seconda delle impostazioni locali, questo lascerà lettere accentate nel percorso e nel nome del file, il che è OK per i moderni file system FAT, come sembra.

Per ogni percorso e nome del file di destinazione, le directory vengono create secondo necessità utilizzando mkdir -p, quindi il file viene copiato, a meno che non sia già esistito.

Nota la citazione " i caratteri in vari luoghi, sono tenuti a mantenere percorsi e nomi con spazi in essi da rompere a parte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.