Копія Linux у файлову систему fat32: аргумент недійсний


12

Коли я копіюю файли з розділу ext3 в один fat32 один за допомогою cp:

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

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

Чи є спосіб отримати cp, щоб викреслити недійсні символи для цільової файлової системи?

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

Відповіді:


10

Звичайні підозрювані, коли потрібно складні копії чи перейменування, - це GNU cp, zmv від zsh, rsync та pax (або cpio). У cp немає жодної функції перейменування, а також (я думаю) у rsync. Хоча zmv може перейменовувати, це не добре поєднується з рекурсивними копіями. Але Pax може це зробити:

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

Це змінює кожного *?:на _. Попередження: мінімально перевірено. Якщо трапляються зіткнення, той, який файл копіюється останній, виграє.


Приємно - раніше не використовували pax. Дякую, що поставили мене до цього.
пн

1
Зворотна коса також створює проблеми з vfat. Включіть його також у регулярний вираз. Спасибі!
lzap

Повний список відповідно до support.grouplogic.com/?p=1607 становить: /? <> \: * | ”^. Крім того, він не може закінчуватися пробілом або крапкою, а деякі імена зарезервовані. Mtools manpage дає ще більший список:,; :? + * = [] <> '"\ / |
dhill

І інша примітка і для людей, які мають таку ж проблему, як і я: pax не підтримує використання -s у поєднанні з командою оновлення -u. Тобто він завжди буде копіювати перейменовані файли знову, навіть якщо вони вже існують. Щоб дізнатися про це, мені знадобилися години .
balu

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\'

Я спробував скопіювати це на карту MicroSDHC телефону Android з файловою системою vfat та вдосконаленою paxкомандою, поки все не спрацювало. Це може бути недостатньо для Windows та Unicode:

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

Ви також можете скористатися параметром -k, щоб переконатися у відсутності перезаписів (через зіткнення імен файлів). Обидва списки, які я дав у коментарі, відрізнялися від поведінки Linux vfat.


0

Я отримав "Недійсний аргумент" при копіюванні з cp -r source usbstick і з'ясував, що причиною було ім'я джерела, що закінчується пробілом. Видалення пробілу очистило повідомлення. Файл з неправильним іменем трапився BTW, і в цьому випадку він знаходиться в каталогах програм mailer.


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), я придумав цей маленький скриптовий сценарій.

#! /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, потім файл копіюється, якщо він вже не існував.

Зверніть увагу на "рядки цитат у різних місцях, вони зобов’язані утримувати шляхи та імена з пробілами в них не розбиватися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.