다음과 같은 명명 규칙을 따르는 긴 폴더 목록이 있습니다.
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}