rsync 패턴 일치 이름

rsync 패턴 일치 이름

여러 파일을 rsync하고 동기화 대상을 일치시킬 때 이름의 대소문자, 공백, 마침표, 대시 또는 밑줄의 차이를 무시하고 싶습니다.

따라서 극단적인 예로 "TheFilename.zip"은 "__THE- - -File---nam-e....._.zip"과 일치합니다(크기와 시간이 일치한다고 가정).

나는 이것을 할 방법을 생각할 수 없다.

답변1

이 스크립트는 당신이 원하는 것을 할 수 있습니다

#!/bin/bash
#
ritem="$1"              # [ user@ ] remotehost : [ / ] remotepath_to_directory
shift

rhost="${ritem/:*}"     # Can be remotehost or user@remotehost
rpath="${ritem/*:}"     # Can be absolute or relative path to a directory

# Get list of files on remote
#
echo "Looking in $rpath on $rhost" >&2
ssh -n "$rhost" find "$rpath" -maxdepth 1 -type f -print0 |
    while IFS= read -r -d $'\0' rfile
    do
        rkey=$(printf "%s" "$rfile" | tr -d '[:space:]_. -' | tr '[:upper:]' '[:lower:]')
        list[${rkey/*\/}]="$rfile"
    done


# Get list of files from local and copy to remote
#
ss=0

echo "Considering $*" >&2
for lpath in "$@"
do
    test -f "$lpath" || continue

    lfile="${lpath/*\/}"
    lkey=$(printf "%s" "$lfile" | tr -d '[:space:]_. -' | tr '[:upper:]' '[:lower:]')

    # Do we have a match in the map
    rfile="${list[$lkey]}"
    test -z "$rfile" && rfile="$lfile"

    # Copy across to the remote system
    echo "Copying $lpath to $rhost:$rpath/$rfile" >&2
    rsync --dry-run -av "$lpath" "$rhost":"$rpath/$rfile" || ss=$((ss+1))
done


# All done. Exit with the number of failed copies
#
exit $ss

사용 예

375871.sh remotehost:remotepath localpath/*

--dry-run예상대로 작동한다고 만족스러우면 제거하세요.

답변2

Satō Katsura가 의견에서 지적했듯이 이는 rsync기본적으로 불가능합니다. 이 또한 rsync해서는 안 될 일이라고 생각합니다.

복사하는 경우단일 파일, 파일 이름을 변수에서 사용할 수 있는 경우 name파일 __THE- - -File---nam-e...._.zip이름에서 원하지 않는 문자를 제거하고 다음과 같이 파일을 복사할 수 있습니다.

ext=${name##*.}
shortname=${name%.$ext}

rsync -a "$name" "user@target:${shortname//[-_ .]}.$ext"

왜냐하면 name='__THE- - -File---nam-e...._.zip', $ext그럴 zip것이고 $shortname그럴 것이기 때문입니다 __THE- - -File---nam-e...._.

쉘이 이를 지원하지 않으면 ${parameter//word}다음을 사용하십시오.

rsync -a "$name" "user@target:$(printf '%s' "$shortname" | tr -d '-_ .' ).$ext"

둘 다 ${shortname//[-_ .]}.$ext될 것 $(printf '%s' "$shortname" | tr -d '-_ .' ).$ext입니다 THEFilename.zip.

관련 정보