파일 이름에서 모든 괄호를 제거하려고 노력했습니다. 이 작업을 수행하기 위해 bash 스크립트를 만드는 데 도움을 줄 수 있는 사람이 있습니까?
다음 bash 스크립트는 대괄호가 없는 파일 이름과 완벽하게 작동하지만 대괄호가 있으면 파일 이름이 두 배가 됩니다.
#!/bin/bash
for fname in *; do
name="${fname%\.*}"
extension="${fname#$name}"
newname="${name//[/}"
newfname="$newname""$extension"
if [ "$fname" != "$newfname" ]; then
#echo mv "$fname" "$newfname"
mv "$fname" "$newfname"
fi
done
예제 출력:
$ touch [test]
$ ls
[test] rep.sh
$ bash rep.sh
$ ls
rep.sh test][test]
따라서 여는 괄호는 제거되지만 파일 이름은 중복됩니다.
답변1
나는 이 안감을 찾았고 이것은 작동합니다:
for x in *[*; do mv -- "$x" "${x//[/}"; done
이렇게 하면 작업이 수행됩니다. 이 명령을 실행할 때마다 여는 대괄호 또는 닫는 대괄호를 바꾸십시오.
답변2
@juicebyah가 게시한 솔루션은 초기 대괄호만 제거합니다. OP가 두 개의 괄호를 제거하려는 경우 sed
다음과 같이 사용하는 것이 좋습니다 .
find . -type f -iname "*[*" | \
while IFS= read -r line; \
do mv "$line" "$(printf %s "$line" | sed -re 's/(\[|\])//g')"; done;
답변3
rename
두 줄의 코드에 포함시키는 것이 훨씬 더 쉽습니다.
while rename ] '' *; do true; done
while rename [ '' *; do true; done
rename
$3+의 파일 이름에서 처음 나타나는 $1을 $2로 바꾸고 이 블록은 모든 파일 이름과 디렉터리 이름에서 모든 괄호를 제거합니다.연속WD.
답변4
파일 이름이 두 배로 늘어나는 이유 $fname
는[test]
name="${fname%\.*}"
extension="${fname#$name}"
결과 :
name=[test]
extension=[test]
(아래에 설명이 있습니다.) 나중에 $extension
와 연결 하면 $newname
가 됩니다 test][test]
.
사용해야 할 것:
name=${fname%.*}
extension=${fname#"$name"}
변수 할당 시 매개변수 확장 후에는 토큰화가 발생하지 않으므로 매개변수 확장 주위에 따옴표가 필요하지 않습니다(이 경우). 또한 특별한 내용이 없으므로 .
백슬래시를 사용하여 이스케이프 처리할 필요가 없습니다.
$name
그러나 두 번째 줄의 따옴표는 필수적입니다. 확장명을 $name
따옴표로 묶지 않으면 glob 패턴으로 처리되며 해당 값은 "single 또는 " [test]
로 해석됩니다 . 이는 접두사 일치가 아니므 로 따옴표가 없으며 값으로 설정됩니다 .est$fname
extension
$fname
위와 별도로 다음을 사용하여 이름에서 모든 대괄호를 제거할 수 있습니다.
${fname//[][]/}
패턴은 문자 클래스 내의 문자 클래스입니다. ]
문자는 클래스의 첫 번째 문자인 경우 일반 문자로 처리되며 [
항상 일반 문자로 처리됩니다. 따라서 캐릭터 클래스는 ]
와 [
이 순서로 구성됩니다.