Cópia do Linux para o sistema de arquivos fat32: argumento inválido

12

Quando copio arquivos de uma partição ext3 para uma fat32 usando o cp:

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

Recebo mensagens de argumento inválidas para todos os arquivos com dois pontos e pontos de interrogação.

Existe alguma maneira de o cp remover os caracteres inválidos do sistema de arquivos de destino?

edit: Verifiquei as opções do cp novamente e, a menos que eu esteja sendo estúpido, não há nada lá. Tenho certeza de que poderia escrever um script, mas parece que deve haver uma solução mais limpa!

mo-seph
fonte

Respostas:

10

Os suspeitos comuns quando você deseja cópias ou renomeações complexas são GNU cp, zmv de zsh, rsync e pax (ou cpio). Não há recurso de renomeação no cp, nem (acho) no rsync. Embora o zmv possa renomear, isso não combina bem com cópias recursivas. Mas pax pode fazer isso:

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

Isso muda cada um *?:para _. Aviso: minimamente testado. Se houver colisões, o arquivo copiado será o último a ganhar.

Gilles 'SO- parar de ser mau'
fonte
Bom - não usei pax antes. Obrigado por me colocar nisso.
precisa saber é o seguinte
1
A barra invertida também causa problemas ao vfat. Inclua-o no regexp também. Obrigado!
lzap
A lista completa de acordo com support.grouplogic.com/?p=1607 é: /? <> \: * | ^. Também não pode terminar com espaço ou ponto e alguns nomes são reservados. A página de manual do Mtools fornece uma lista ainda maior:,; :? + * = [] <> '"\ / |
dhill 29/03
E uma observação diferente e para pessoas com o mesmo problema que eu: o pax não suporta o uso de -s em combinação com o comando update -u. Ou seja, ele sempre copiará arquivos renomeados novamente, mesmo que eles já existam. Levei horas para descobrir isso.
balu
11

Baseado no post de Gilles, testei a seguinte 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\'

Tentei copiar isso no cartão MicroSDHC do telefone Android com sistema de arquivos vfat e paxcomando refinado até que tudo funcionasse. Isso ainda pode não ser suficiente para Windows e Unicode:

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

Você também pode usar a opção -k para garantir que não haja substituições (devido a colisões nos nomes dos arquivos). As duas listas que dei no comentário eram diferentes do comportamento do Linux vfat.

dhill
fonte
0

Recebi o "argumento inválido" ao copiar com cp -r source usbstick e descobri que a causa era um sourcefilename que terminava com um espaço. A remoção do espaço limpou a mensagem. O arquivo com nome incorreto estava entre os diretórios do programa de correspondência.

JohanArnold
fonte
0

Eu só tinha motivos para fazer isso e, embora a paxresposta baseada fosse boa, ela ainda apresentava problemas com caracteres acentuados.

Portanto, achei mais simples de usar tare substituí-lo por todos os caracteres não permitidos por sublinhados:

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

Sem dúvida, é possível criar uma lista melhor de caracteres permitidos do que o descrito acima, mas isso funciona.

Chapeleiro Louco
fonte
0

Depois de ler as respostas para essa pergunta muito interessante e fazer algumas experiências com o cartão SD para Android (exfat) e um sistema de entretenimento para carros (vfat), eu vim com esse pequeno script do 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

Ele pega o destino (ponto de montagem) como argumento e usa findpara localizar todos os arquivos no meu repositório de música.

Para cada caminho de arquivo, ele calcula um caminho de destino e um nome de arquivo, acrescentando o destino e substituindo qualquer caractere incorreto por um sublinhado _. Eu uso uma lista branca de caracteres (letras, números -, /, ., . (, )E _) para remover qualquer pontuação indesejada.

Dependendo da localidade, isso deixará letras acentuadas no caminho e no nome do arquivo, o que é bom para os sistemas de arquivos FAT modernos, ao que parece.

Para cada caminho e nome do arquivo de destino, os diretórios são criados conforme necessário mkdir -p, e o arquivo é copiado, a menos que já exista.

Observe os "caracteres de cotação em vários lugares; eles são obrigados a impedir que caminhos e nomes com espaços neles se separem.

Ber
fonte