Copia de Linux al sistema de archivos fat32: argumento no válido

12

Cuando copio archivos de una partición ext3 a una fat32 usando cp:

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

Recibo mensajes de argumentos no válidos para todos los archivos con dos puntos y signos de interrogación.

¿Hay alguna forma de hacer que cp elimine los caracteres no válidos para el sistema de archivos de destino?

editar: he revisado las opciones de cp nuevamente, y a menos que sea estúpido, no hay nada allí. Estoy seguro de que podría escribir un guión, ¡pero parece que debería haber una solución más limpia!

mo-seph
fuente

Respuestas:

10

Los sospechosos habituales cuando desea copias complejas o cambios de nombre son GNU cp, zmv de zsh, rsync y pax (o cpio). No hay una función de cambio de nombre en cp, ni (creo) en rsync. Si bien zmv puede cambiar el nombre, esto no encaja bien con las copias recursivas. Pero pax puede hacerlo:

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

Esto cambia cada *?:a _. Advertencia: mínimamente probado. Si hay colisiones, el último archivo copiado gana.

Gilles 'SO- deja de ser malvado'
fuente
Agradable, no he usado pax antes. Gracias por ponerme a ello.
mo-seph
1
Backslash también causa problemas a vfat. Inclúyalo también en la expresión regular. ¡Gracias!
lzap
La lista completa de acuerdo con support.grouplogic.com/?p=1607 es: /? <> \: * | "^. Además, no puede terminar con espacio o punto y algunos nombres están reservados. La página de manual de Mtools ofrece una lista aún mayor:,; :? + * = [] <> '"\ / |
dhill
Y una nota diferente y para las personas que tienen el mismo problema que yo: pax no admite el uso de -s en combinación con el comando de actualización -u. Es decir, siempre copiará los archivos renombrados nuevamente, incluso si ya existen. Me llevó horas descubrirlo .
balu
11

Basado en una publicación de Gilles probé la siguiente lista:

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

Traté de copiar eso en la tarjeta MicroSDHC del teléfono Android con el sistema de archivos vfat y el paxcomando refinado hasta que todo funcionó. Es posible que aún no sea suficiente para Windows y Unicode:

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

También puede usar la opción -k para asegurarse de que no se sobrescriban (debido a colisiones en los nombres de archivo). Ambas listas que di en el comentario eran diferentes del comportamiento de Linux vfat.

dhill
fuente
0

Recibí el "argumento no válido" al copiar con cp -r source usbstick y descubrí que la causa era un nombre de archivo fuente que terminaba con un espacio. Al eliminar el espacio se borró el mensaje. El archivo con nombre incorrecto sucedió BTW en este caso para estar en los directorios del programa de correo.

JohanArnold
fuente
0

Simplemente tenía motivos para necesitar hacer esto, y aunque la paxrespuesta basada en la respuesta era buena, todavía tenía problemas con los caracteres acentuados.

Así que me pareció más fácil de usar tary conseguí que reemplazara todos los caracteres no permitidos con guiones bajos:

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

Es indudablemente posible obtener una mejor lista de caracteres permitidos que la anterior, pero esto funciona.

MadHatter
fuente
0

Después de leer las respuestas a esta pregunta muy interesante y experimentar un poco con la tarjeta SD para Android (exfat) y un sistema de entretenimiento para el automóvil (vfat), se me ocurrió este pequeño 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

Toma el destino (punto de montaje) como argumento y lo usa findpara localizar todos los archivos en mi repositorio de música.

Para cada ruta de archivo, calcula una ruta de destino y un nombre de archivo anteponiendo el destino y reemplazando cualquier carácter ofensivo con un guión bajo _. Yo uso una lista blanca de caracteres (letras, dígitos -, /, ., . (, )E _) para eliminar cualquier puntuacion no deseado.

Dependiendo de la configuración regional, esto dejará letras acentuadas en la ruta y el nombre del archivo, lo cual está bien para los sistemas de archivos FAT modernos, como parece.

Para cada ruta y nombre de archivo de destino, los directorios se crean según sea necesario usando mkdir -p, luego el archivo se copia, a menos que ya exista.

Tenga en cuenta los "caracteres de comillas en varios lugares, son necesarios para evitar que las rutas y los nombres con espacios se separen.

Ber
fuente