가장 간단한 방법은 파일 시스템 계층을 활용하여 파일 이름을 변환하는 것입니다. Ubuntu 12.04부터는 파일 이름을 Windows VFAT가 지원하는 이름으로 fuse-posixovl 로 변환 하는 FUSE 파일 시스템이 있습니다.
sudo mount.posixovl /media/sdb1
chown guillaume /media/sdb1
rsync -au ~/mail /media/sbd1/
또는 루트 액세스가 필요하지 않도록 :
mkdir ~/mnt
/sbin/mount.posixovl -S /media/sdb1 ~/mnt
rsync -au ~/mail ~/mnt/
VFAT가 동의하지 않는 파일 이름의 문자는 다음과 같이 인코딩 된 %(XX)
곳 XX
진수 자리입니다. POSIXovl 1.2.20120215부터는 같은 파일 이름 %(3A)
이 그 자체로 인코딩되고로 디코딩 :
되므로 형식의 하위 문자열을 포함하는 파일 이름이 있으면 충돌의 위험이 있습니다 %(XX)
.
POSIXovl이 너무 긴 파일 이름을 처리하지 않도록주의하십시오. 인코딩 된 이름이 255 자에 맞지 않으면 파일을 저장할 수 없습니다.
POSIXovl은라는 파일에 유닉스 권한과 소유권을 저장합니다 .pxovl.FILENAME
.
다음 bash ≥4 스크립트 는의 모든 파일에 복사 ~/mail/foo:bar
합니다 . 대상 트리에 이미 존재하고 소스보다 오래된 파일은 건너 뜁니다./media/usb99/mail/foo_bar
~/mail
#!/bin/bash
set -e
shopt -s dotglob globstar
for source in "$HOME"/mail/**/*; do
target=/media/usb99/${source#"$HOME"/}
target=${target//:/_}
if [[ -d $source ]]; then
mkdir -p -- "$target"
elif [[ $target -ot $source ]]; then
cp -p -- "$source" "$target"
fi
done
이 스크립트는 zsh에서 약간만 수정하여 작동합니다 : replace shopt -s dotglob globstar
by setopt dot_glob
and [[ $target -ot $source ]]
by [[ ! -e $target || $target -ot $source ]]
.
다음은 zsh 2 라이너입니다 (오토로드를 세면 3 개). 짧지 만 상당히 진보되어 있으며 읽기 쉽지 않습니다.
autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
zargs
라인에 해당 mkdir -p ~/mail/**/*(…)
디렉토리 이름의 누적 길이가 너무 긴 경우는 밖으로 폭격하지 않을 것을 제외하고. 이 줄은 필요에 따라 대상 디렉토리를 만듭니다.
~/mail/**/*(/)
아래의 모든 디렉토리로 확장됩니다 ~/mail
( (/)
끝 으로 인해 디렉토리 만 ).
(/e\''…'\')
디렉토리에만 선택하고 '…'내의 코드를 추가로 실행하여 REPLY
변수에 저장된 각 파일 이름을 변환 합니다.
${${REPLY#$HOME/}//:/_}
소스 디렉토리에 해당하는 접 두부를 제거하고로 변경 :
합니다 _
.
zmv -C
첫 번째 피연산자 (zsh 패턴)와 일치하는 각 파일을 두 번째 피연산자를 확장하여 얻은 파일 이름으로 복사합니다.
-o -pu
통과 말한다 -pu
받는 cp
권한을 보존하고 업데이트 된 파일을 복사 할 수 있도록, 유틸리티입니다. (우리는 zsh에게 업데이트 확인을 수행하도록 지시 할 수 있습니다. 조금 더 빠르지 만 훨씬 더 암호입니다.)
(.)
일반 파일 만 선택합니다. -Q
이것은 이것이 .
하위 표현식을 나타내는 괄호가 아닌 glob 한정자로 구문 분석되어야한다고 말합니다 .
$1
및 $2
대체 텍스트에 괄호 표현과 일치 (**/)
하고 *
. ( **
괄호 안에 정확히 포함되어 있지 않으면 괄호 안에 있으면 0 이상의 하위 디렉토리 수준이라는 특별한 의미를 잃게됩니다 **/
.)
필자는 처음 에 파일 이름 변경 기능 ( 옵션) 이있는 보관 도구 (여기서는 통과 모드에서 사용하도록 의도 된) 인 pax 를 사용하려고 생각했습니다 -s
. 그러나 -s
and -u
옵션은 함께 작동하지 않습니다 ( pax 의 POSIX 정의는 말 그대로 -u
변환 된 파일 이름이 아닌 대상 트리에서 동일한 이름의 파일을 검사해야 한다고 말합니다 -s
. 우분투의 pax 구현은 말 그대로 사양을 따릅니다. 유용하게). 하드 링크를 사용하여 이름을 바꾼 하드 링크를 만든 다음 하드 링크 ( rsync -au
또는 또는를 사용하여 pax -rw -pp -u
)를 다른 미디어에 복사하는 것은 여전히 가능 하지만 가치보다 문제가 많습니다.
cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/