Копирование Linux в файловую систему FAT32: неверный аргумент

12

Когда я копирую файлы из раздела ext3 в раздел fat32 с помощью cp:

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

Я получаю недопустимые сообщения с аргументами для всех файлов с двоеточиями и знаками вопроса.

Есть ли способ заставить cp удалить лишние символы для целевой файловой системы?

редактировать: я снова проверил параметры cp, и если я не глуп, там ничего нет. Я уверен, что мог бы написать сценарий, но такое чувство, что должно быть более чистое решение!

мо-Seph
источник

Ответы:

10

Обычные подозрения, когда вам нужны сложные копии или переименования, это GNU cp, zmv из zsh, rsync и pax (или cpio). В cp нет ни функции переименования, ни (я думаю) в rsync. Хотя zmv может переименовывать, это плохо сочетается с рекурсивными копиями. Но Пакс может сделать это:

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

Это меняет каждый *?:на _. Предупреждение: минимально проверено. Если есть столкновения, какой бы файл ни копировался, последний побеждает.

Жиль "ТАК - перестань быть злым"
источник
Хорошо - раньше не пользовался pax. Спасибо, что поставили меня на это.
mo-seph
1
Обратная косая черта также создает проблемы для vfat. Включите его также в регулярное выражение. Благодарность!
lzap
Полный список в соответствии с support.grouplogic.com/?p=1607 : /? <> \: * | ^ Также он не может заканчиваться пробелом или точкой и некоторые имена зарезервированы. Mantools Manpage дает еще больший список:,; :? + * = [] <> ' "\ / |
dhill
И другое примечание для людей, имеющих ту же проблему, что и я: pax не поддерживает использование -s в сочетании с командой обновления -u. Т.е. он всегда будет снова копировать переименованные файлы, даже если они уже существуют. Мне потребовались часы, чтобы узнать об этом.
бал
11

На основании сообщения Жиля я проверил следующий список:

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

Я пытался скопировать это на карту Android MicroSDHC с файловой системой vfat и уточнил paxкоманду, пока все не заработало. Этого может быть недостаточно для Windows и Unicode:

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

Вы также можете использовать опцию -k, чтобы избежать перезаписей (из-за коллизий в именах файлов). Оба списка, которые я дал в комментарии, отличались от поведения Linux vfat.

dhill
источник
0

Я получил «Неверный аргумент» при копировании с помощью cp -r source usbstick и обнаружил, что причиной было имя исходного файла, заканчивающееся пробелом. Удаление пробела очистило сообщение. Кстати, файл с неправильным именем оказался в каталоге программ почтовой программы.

JohanArnold
источник
0

У меня просто была причина, чтобы сделать это, и хотя paxответ на основе был хорош, он все еще сталкивался с проблемами с символами с акцентом.

Поэтому я обнаружил, что проще использовать tarи заставить его заменить все недопустимые символы подчеркиванием:

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

Несомненно, можно придумать лучший список разрешенных символов, чем приведенный выше, но это работает.

Безумный Шляпник
источник
0

Прочитав ответы на этот очень интересный вопрос и поэкспериментировав с SD-картой для Android (exfat) и автомобильной развлекательной системой (vfat), я придумал этот маленький скрипт 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

Он принимает пункт назначения (точку монтирования) в качестве аргумента и использует findдля поиска всех файлов в моем музыкальном хранилище.

Для каждого пути к файлу он вычисляет путь назначения и имя файла, добавляя место назначения и заменяя любой символ, вызывающий оскорбления, подчеркиванием _. Я использую белый список символов (буквы, цифры, -, /, ., . (, )И _) , чтобы удалить любые нежелательные знаки препинания.

В зависимости от локали, это оставит акцентированные буквы в пути и имени файла, что нормально для современных файловых систем FAT, как кажется.

Для каждого пути и имени файла назначения каталоги создаются по мере необходимости mkdir -p, затем файл копируется, если он уже не существовал.

Обратите внимание на "символы в кавычках в разных местах, они необходимы, чтобы пути и имена с пробелами в них не разрывались.

Бер
источник