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.