폴더 이름에 특수 문자 추가

폴더 이름에 특수 문자 추가

다음과 같은 명명 규칙을 따르는 긴 폴더 목록이 있습니다.

ABS1789_2563-01
ABS1789_2563-02
ABS1789_2563-02

.
.
.

bash를 사용하여 ABS와 1789 사이에 "-"를 추가한 다음 1789와 2563 사이에 "_"를 "-"로 어떻게 바꾸나요?

답변1

IFS="\n"                        # Handle files with spaces in the names
for file in ABS*; do
    newfile="${file/ABS/ABS-}"  # Add the hyphen following ABS
    newfile="${newfile/_/-}"    # Change the underscore to a hyphen
    mv "$file" "$newfile"       # Make the change
done

아래 Tony의 의견을 바탕으로 보다 일반적인 버전은 다음과 같을 수 있습니다.

IFS="\n"                          # Handle files with spaces in the names
for file in ABS*; do
    newfile="${file/foo/bar}"     # Replace foo with bar
    newfile="${newfile/baz/quux}" # Replace baz with quux (repeat as needed)
    if [[ "$file" == "$newfile" ]]; then
        echo "Not renaming $file - no change decreed."
    elif [[ -f "$newfile" ]]; then
        echo "Not renaming $file - $newfile already exists."
    else
        mv -- "$file" "$newfile"       # Make the change
    fi
done

답변2

적절한 대답은 이름 변경에 따라 다릅니다. 필드 너비가 일정하다고 가정하면 쉘의 내장 매개변수 대체를 사용하여 이름을 변환할 수 있습니다. 범위가 상대적으로 제한되어 있습니다.

더욱 흥미로운 점은 다음에서 문자 클래스를 사용한다는 것입니다 sed.

newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/\1-\2-/')

즉, 선행 문자 접두사 뒤에 대시를 추가하고 밑줄로 끝나는 숫자 뒤에 대시를 변경합니다.저것대시에.

매개변수 대체를 사용하는 가능한 솔루션과 달리 이 방법은 문자 접두사와 0이 아닌 모든 길이의 숫자를 허용합니다. 따라서 이를 입력으로 제공할 수 있습니다.

ABS1789_2563-01
ABS1789_2563-02
ABS1789_2563-02
ABSOLUTE1789_2563-01
ABSURD1789_2563-02
ABSOLVE1789_2563-02
PREFIX1793939389_2563-02

스크립트에 넣어

#!/bin/sh
for oldname in `cat foo4.txt`
do
newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/\1-\2-/')
echo "$oldname ->$newname"
done

(적절한 루프에서) 다음 출력을 제공합니다.

ABS1789_2563-01 ->ABS-1789-2563-01
ABS1789_2563-02 ->ABS-1789-2563-02
ABS1789_2563-02 ->ABS-1789-2563-02
ABSOLUTE1789_2563-01 ->ABSOLUTE-1789-2563-01
ABSURD1789_2563-02 ->ABSURD-1789-2563-02
ABSOLVE1789_2563-02 ->ABSOLVE-1789-2563-02
PREFIX1793939389_2563-02 ->PREFIX-1793939389-2563-02

답변3

모든 것이 다음으로 시작된다면ABS1789_2563-

for f in ABS*; do mv "$f" ABS-1789-2563-${f:13}; done

여기

ABS-1789-2563-

모든 폴더가 다음으로 시작한다고 가정하여 하드 코딩되었습니다.ABS1789_2563-.

${f:13}

오프셋 13에서 시작하여 인수 끝까지 확장됩니다 $f. 종종 호출됩니다.하위 문자열. 배쉬에서하위 문자열 확장.

바라보다3.5.3 쉘 매개변수 확장, 부분:

${parameter:offset}
${parameter:offset:length}

관련 정보