12

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

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

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

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

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

5 ответов5

10

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

#!/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.

10

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

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

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

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 , затем файл копируется, если он еще не существовал.

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .