다음과 같은 폴더에 많은 파일 이름이 있습니다.xxxxxxxxx.zip
쉘 스크립트를 사용하여 모든 파일에서 점 앞의 마지막 2자를 제거하는 방법.
abcd12345678.zip
예를 들어abcd123456.zip
답변1
셸 내부에서는 변수 확장을 사용할 수 있습니다.
fname에 파일 이름이 포함된 경우( abcd12345678.zip
예:) 다음을 수행할 수 있습니다.
fname=abcd12345678.zip
ftail=${fname##*.}
fnew=${fname%??".$ftail"}
echo mv "$fname" "$fnew.$ftail"
디렉터리의 모든 파일을 처리합니다(파일이 이미 존재하는지 확인).
for fname in *.zip; do
ftail=${fname##*.}
fnew="${fname%??".$ftail"}.$ftail"
if [ -e "$fnew" ]; then
echo "File $fnew already exist, not moving"
else
echo mv "$fname" "$fnew"
fi
done
작동한다고 확신하면 echo
이전 항목을 제거하여 실제로 파일을 이동하세요.echo mv ....
답변2
무엇에 대해 rename
?
rename 's/..\././g' abcd12345678.zip
sed
구문은 의 구문과 동일합니다.
답변3
널리 사용되는 Bash 쉘을 사용하면 =~
연산자를 테스트에 사용하여 정규식을 테스트할 수 있습니다 [[
. 변수에 f
다음이 포함되어 있다고 가정합니다.
$ echo "$f"
abcd12345678.zip
다음과 같이 마지막 숫자를 일치시킬 수 있습니다.
$ [[ "$f" =~ (.*)..\.zip ]] && echo "${BASH_REMATCH[1]}".zip
abcd123456.zip
아니면 다음과 같이 더 추상적으로 만들 수도 있습니다.
$ [[ "$f" =~ (.*)..(\.zip) ]] && echo "${BASH_REMATCH[1]}""${BASH_REMATCH[2]}"
이름을 바꾸려면 를 사용하십시오 mv
.
답변4
그리고 zsh
:
autoload -Uz zmv # best in ~/.zshrc
zmv -n '(*)??(.*)' '$1$2'
만족스러우면 제거하세요 -n
(드라이런의 경우).
파일 이름에 점이 여러 개 포함된 경우 마지막 문자 앞의 2문자가 삭제됩니다.