FAT32 파일 시스템으로 Linux 복사 : 잘못된 인수


12

cp를 사용하여 ext3 파티션에서 fat32 파티션으로 파일을 복사 할 때 :

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

콜론과 물음표가있는 모든 파일에 대해 잘못된 인수 메시지가 나타납니다.

cp가 대상 파일 시스템의 유효하지 않은 문자를 제거하는 방법이 있습니까?

편집 : cp의 옵션을 다시 확인했으며 바보가 아닌 한 아무것도 없습니다. 스크립트를 작성할 수 있다고 확신하지만 더 확실한 해결책이 있어야합니다!

답변:


10

복잡한 사본이나 이름 바꾸기를 원할 때 일반적인 의심은 GNU cp, zmv의 zmv, rsync 및 pax (또는 cpio)입니다. cp에는 이름 바꾸기 기능이 없으며 rsync에는 이름이 없습니다. zmv는 이름을 바꿀 수 있지만 재귀 복사본과 잘 맞지 않습니다. 그러나 pax는 그것을 할 수 있습니다 :

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

각각이로 변경 *?:됩니다 _. 경고 : 최소 테스트. 충돌이 있으면 마지막으로 복사 된 파일이 이깁니다.


니스-전에는 팍스를 사용하지 않았습니다. 그것을 넣어 주셔서 감사합니다.
— mo-seph

1
백 슬래시는 또한 vfat에 문제를 일으 킵니다. 정규 표현식에도 포함하십시오. 감사!
— lzap

support.grouplogic.com/?p=1607 에 따른 전체 목록 은 다음과 같습니다. /? <> \ : * | ”^. 또한 공백이나 점으로 끝날 수 없으며 일부 이름이 예약되어 있습니다. Mtools 맨 페이지는 더 큰 목록을 제공합니다. :? + * = [] <> ' "\ / |
— dhill

그리고 다른 메모와 저와 같은 문제가있는 사람들을 위해 : pax는 update 명령 -u와 함께 -s 사용을 지원하지 않습니다. 즉, 이름이 변경된 파일은 이미 존재하더라도 항상 다시 복사합니다. 그것에 대해 알아내는 데 몇 시간이 걸렸습니다 .
— balu

11

Gilles의 게시물을 기반으로 다음 목록을 테스트했습니다.

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

vfat 파일 시스템과 pax모든 것이 작동 할 때까지 세련된 명령 으로 Android 전화 MicroSDHC 카드에 복사하려고 했습니다. 여전히 Windows와 Unicode에는 충분하지 않을 수 있습니다.

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

-k 옵션을 사용하여 파일 이름의 충돌로 인해 덮어 쓰기가 없는지 확인할 수도 있습니다. 내가 언급 한 두 목록은 Linux vfat 동작과 다릅니다.


0

cp -r source usbstick으로 복사 할 때 "Invalid argument"가 발생하고 원인이 공백으로 끝나는 sourcefilename이라는 것을 알았습니다. 공간을 제거하면 메시지가 지워졌습니다. 이 경우 잘못된 이름의 파일이 BTW로 발생하여 메일러 프로그램 디렉토리에있게됩니다.


0

방금이 작업을 수행 해야하는 이유가 있었으며 pax기반 답변이 좋지만 여전히 악센트 문자에 문제가 발생했습니다.

따라서 사용이 더 간단하고 tar허용되지 않는 모든 문자를 밑줄로 바꾸는 것이 더 낫습니다.

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

위의 것보다 더 나은 허용 문자 목록을 만드는 것이 의심의 여지가 없지만 이것은 효과가 있습니다.


0

이 흥미로운 질문에 대한 답을 읽고 Android (exfat) 및 자동차 엔터테인먼트 시스템 (vfat) 용 SD 카드를 실험 한 후이 작은 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한 다음 파일이 이미 존재하지 않는 한 파일을 복사합니다.

"다양한 장소에서 따옴표 문자를 확인 하십시오. 경로와 이름이 공백으로 구분되지 않아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.