중복 이름 회피 bash 스크립트

[code:1ykua0gg]#!/usr/bin/env bash
#duplication_evasion : 파일명의 중복을 해결해줍니다. 대소문자를 무시하므로 사용에는 주의해주세요. ‘원본명.확장자’ ‘원본명 (d중복수).확장자’ 식으로 증가해나갑니다. 만약 중복된것이 없다면 입력을 그대로 반환합니다. 이 함수는 한 개체에 대해 작업을 수행합니다.
#PIPO 有 : PIPO->비교할 이름; 인수->비교대상; PIPO 無 : $1->비교할 이름; 나머지 인수->비교대상
allname=n
IFS=$‘\n’
while [[ $# > 0 ]]; do
case "$1" in
-p )
#비교 대상을 주어진 경로에서 찾습니다(상대경로도 가능). ‘-q’ 옵션을 포함합니다.
findpath=$2
qouting=-e
shift 2;;
-q )
qouting=-e
shift;;
-n )
#주어진 대상이름을 한 덩어리로 취급합니다.
allname=y
shift;;
– )
shift
break;;
* )
break;;
esac
done
if [ ! -t 0 -o -p /dev/stdin ]; then
code=$(</dev/stdin)
if [ -z "$code" ]; then
code=$1
shift
fi
else
code=$1
shift
fi
if grep -q / <<<"$code"; then
findpath=$(dirname – "$code")
code=$(basename – "$code")
qouting=-e
fi
if [ -n "$findpath" -o -n "$" ]; then
if [ -n "$qouting" ]; then
code=$(perl -0pe ‘use encoding "utf8"; s/\/\\/g; s/\0/\0/g; s/\x08/\b/g; s/\a/\a/g; s/\t/\t/g; s/\n/\n/g; s/\v/\v/g; s/\f/\f/g; s/\r/\r/g; s/\n$//;’ <<<"$code"; echo)
if [ -n "$findpath" ]; then
ls=$(ls -a --quoting-style=c – "$findpath" | sed -e "s/^&quot;//" -e "s/&quot;$//" -e ‘s/\"/"/’)
else
ls=$

fi
else
ls=$*
fi
else
echo $qouting "$code"
exit 1
fi
if grep -Fiqx -e "$code" <<<"$ls"; then
if [ $allname = y ] || grep -q ‘^&#46;’ <<<"$code"; then
name=$code
else
Ocode=$(sed ‘s/^&#46;//’ <<<"$codeA")
codeA=$(grep -zaoiP ‘(?<=&#46;)[A-Z0-9]+$’ <<<"$codeA")
if [ "$codeA" = "$Ocode" ]; then
ext=$codeA
else
[ -n "$codeA" ] && ext=$(tr [:upper:] [:lower:] <<<"$codeA")
fi
name=$(basename – "$code" .$ext)
fi
list=$(grep -iEx "sed 's/\(&#46;\)/&#91;\1&#93;/g; s/\&#91;\^\&#93;/\\^/g' &lt;&lt;&lt;&quot;$name&quot; (d[0-9]+)${ext:+\.$ext}" <<<"$ls")
[ -n "$list" ] && c=$(sed -r "s/^.* (d([0-9]+))${ext:+\.$ext}/\1/I" <<<"$list" | sort -n | tail -n 1 | expr $(</dev/stdin) + 1)
echo $qouting "$name (d${c:-1})${ext:+.$ext}"
exit 0
else
echo $qouting "$code"
exit 1
fi[/code:1ykua0gg]

[attachment=0:1ykua0gg]dupev_name.sh.txt[/attachment:1ykua0gg]

perl이 설치되어 있어야 합니다. 간단하게 쓰기에 좋습니다.