답변:
복잡한 사본이나 이름 바꾸기를 원할 때 일반적인 의심은 GNU cp, zmv의 zmv, rsync 및 pax (또는 cpio)입니다. cp에는 이름 바꾸기 기능이 없으며 rsync에는 이름이 없습니다. zmv는 이름을 바꿀 수 있지만 재귀 복사본과 잘 맞지 않습니다. 그러나 pax는 그것을 할 수 있습니다 :
cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition
각각이로 변경 *?:
됩니다 _
. 경고 : 최소 테스트. 충돌이 있으면 마지막으로 복사 된 파일이 이깁니다.
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 동작과 다릅니다.
이 흥미로운 질문에 대한 답을 읽고 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
한 다음 파일이 이미 존재하지 않는 한 파일을 복사합니다.
"
다양한 장소에서 따옴표 문자를 확인 하십시오. 경로와 이름이 공백으로 구분되지 않아야합니다.