Skopiuj Linux do systemu plików fat32: nieprawidłowy argument

12

Kiedy kopiuję pliki z partycji ext3 na fat32 przy użyciu cp:

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

Otrzymuję nieprawidłowe komunikaty argumentów dla wszystkich plików z dwukropkami i znakami zapytania w.

Czy jest jakiś sposób, aby cp usunął nieprawidłowe znaki dla docelowego systemu plików?

edycja: ponownie sprawdziłem opcje cp i chyba że jestem głupi, nic tam nie ma. Jestem pewien, że mógłbym napisać skrypt, ale wydaje się, że powinno być czystsze rozwiązanie!

mo-seph
źródło

Odpowiedzi:

10

Zwykle podejrzanymi, gdy chcesz skomplikowanych kopii lub nazw, są GNU cp, zmv z zsh, rsync i pax (lub cpio). Nie ma funkcji zmiany nazwy w cp, ani (myślę) w rsync. Chociaż zmv może zmieniać nazwę, nie działa to dobrze z kopiami rekurencyjnymi. Ale pax może to zrobić:

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

To zmienia się *?:na _. Ostrzeżenie: minimalnie przetestowane. W przypadku kolizji, którykolwiek plik zostanie skopiowany, ostatni wygrywa.

Gilles „SO- przestań być zły”
źródło
Fajnie - wcześniej nie korzystałem z pax. Dzięki, że mnie w to włożyłeś.
mo-seph
1
Odwrotny ukośnik powoduje również problemy z VFAT Uwzględnij to również w wyrażeniu regularnym. Dzięki!
lzap
Pełna lista według support.grouplogic.com/?p=1607 to: /? <> \: * | ”^. Ponadto nie może kończyć się spacją lub kropką, a niektóre nazwy są zastrzeżone. Strona podręcznika Mtools daje jeszcze większą listę:,; :? + * = [] <> '"\ / |
dhill
I inna uwaga dla osób mających ten sam problem co ja: pax nie obsługuje używania -s w połączeniu z poleceniem aktualizacji -u. Oznacza to, że zawsze będzie ponownie kopiować pliki o zmienionych nazwach, nawet jeśli już istnieją. Dowiedziałem się o tym godziny .
balu
11

Na podstawie postu Gillesa przetestowałem następującą listę:

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

Próbowałem skopiować to na kartę MicroSDHC telefonu z systemem Android z systemem plików vfat i dopracować paxpolecenie, aż wszystko zadziałało. To może wciąż nie wystarczyć dla Windows i Unicode:

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

Możesz także skorzystać z opcji -k, aby upewnić się, że nie ma żadnych nadpisań (z powodu kolizji w nazwach plików). Obie listy, które podałem w komentarzu, różniły się od zachowania vat w systemie Linux.

zjazd
źródło
0

Otrzymałem „Nieprawidłowy argument” podczas kopiowania za pomocą źródła USB cp -r i odkryłem, że przyczyną jest nazwa pliku źródłowego kończąca się spacją. Usunięcie spacji wyczyściło komunikat. Plik o niepoprawnej nazwie stał się BTW w tym przypadku w katalogach programów pocztowych.

JohanArnold
źródło
0

Po prostu musiałem to zrobić i chociaż paxodpowiedź oparta na podstawie była dobra, wciąż napotykała problemy z akcentowanymi postaciami.

Uznałem więc, że jest prostszy w użyciu tari zamienia wszystkie niedozwolone znaki na podkreślenia:

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

Niewątpliwie można wymyślić lepszą listę dozwolonych znaków niż powyższa, ale to działa.

Szalony Kapelusznik
źródło
0

Po przeczytaniu odpowiedzi na to bardzo interesujące pytanie i przeprowadzeniu eksperymentów z kartą SD dla Androida (exfat) i samochodowym systemem rozrywki (vfat), wymyśliłem ten mały skrypt 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

Bierze miejsce docelowe (punkt montowania) jako argument i służy finddo lokalizowania wszystkich plików w moim repozytorium muzycznym.

Dla każdej ścieżki pliku oblicza ścieżkę docelową i nazwę pliku, poprzedzając miejsce docelowe i zastępując każdy znak obrażający znakiem podkreślenia _. Używam białą listę znaków (litery, cyfry, -, /, ., . (, )I _), aby usunąć niechciane znaki interpunkcyjne.

W zależności od ustawień regionalnych pozostawi to litery akcentowane w ścieżce i nazwie pliku, co wydaje się odpowiednie dla nowoczesnych systemów plików FAT, jak się wydaje.

Dla każdej ścieżki i nazwy pliku docelowego katalogi są tworzone w razie potrzeby za pomocą mkdir -p, a następnie plik jest kopiowany, chyba że już istniał.

Zanotuj "znaki cudzysłowu w różnych miejscach, są one wymagane, aby ścieżki i nazwy ze spacjami nie rozpadały się.

Ber
źródło