여러 파일을 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
.