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

12

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

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

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

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

edit: Eu verifiquei as opções do cp novamente, e a menos que eu esteja sendo idiota, não há nada lá. Tenho certeza de que poderia escrever um roteiro, mas parece que deveria haver uma solução mais limpa!

    
por mo-seph 19.08.2010 / 21:44

5 respostas

10

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

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

Isso altera cada *?: para _ . Atenção: minimamente testado. Se houver colisões, o arquivo que for copiado pela última vez vencerá.

    
por 19.08.2010 / 22:28
10

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 copiá-lo para o cartão MicroSDHC com sistema de arquivos vfat e refinei o comando pax até que tudo funcionou. Isso ainda pode não ser suficiente para o Windows e o Unicode:

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

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

    
por 03.04.2012 / 02:22
0

Eu recebi o "argumento inválido" quando copiei com o usbstick cp -r source e descobri que a causa era um sourcefilename terminando com um espaço. A remoção do espaço apagou a mensagem. O arquivo com nome incorreto aconteceu BTW, neste caso, em diretórios do programa de mailer.

    
por 28.01.2013 / 17:53
0

Eu só tinha motivo para fazer isso, e enquanto a resposta pax -based era boa, ainda tinha problemas com caracteres acentuados.

Por isso, achei mais simples usar tar e substituí-los por todos os caracteres não permitidos com 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 acima, mas isso funciona.

    
por 22.08.2014 / 09:31
0

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

Ele toma o destino (ponto de montagem) como argumento e usa find para localizar todos os arquivos no meu repositório de músicas.

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

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

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

Observe que a citação " chars em vários lugares exige que os caminhos e nomes com espaços neles se quebrem.

    
por 17.12.2015 / 01:05