파일명+확장자 사이의 공백을 일괄 제거하려고 하는데, 어떻게 스크립트를 짜야할까요?

윈도우에서는 확장자가 자동으로 숨겨지고, 파일명의 맨 뒤에 공백이 있으면 자동으로 삭제되었는데, 우분투의 노틸러스에는 그런 기능이 없네요. 그래서, 쉘스크립트를 짜서 자동으로 일괄 처리를 하려고 했습니다.
그런데 막상 하려 보니 어떤 명령어를 사용해야할지 모르겠습니다.
영어 대소문자나 특수문자를 포함한 모든 문자를 대상으로 해야 하는데, 옵션에는 대소문자나 숫자, 특수문자만 있어서 난감합니다. 특수문자를 선택하면 외국어(예를 들어, 일본어나 불어나 아랍어 따위)는 포함되지 않을테니 파일들을 날려먹을수 있는데, 어떻게 방법이 없을까요?

[quote="별님":2ny8b87t]윈도우에서는 확장자가 자동으로 숨겨지고, 파일명의 맨 뒤에 공백이 있으면 자동으로 삭제되었는데, 우분투의 노틸러스에는 그런 기능이 없네요. 그래서, 쉘스크립트를 짜서 자동으로 일괄 처리를 하려고 했습니다.
그런데 막상 하려 보니 어떤 명령어를 사용해야할지 모르겠습니다.
영어 대소문자나 특수문자를 포함한 모든 문자를 대상으로 해야 하는데, 옵션에는 대소문자나 숫자, 특수문자만 있어서 난감합니다. 특수문자를 선택하면 외국어(예를 들어, 일본어나 불어나 아랍어 따위)는 포함되지 않을테니 파일들을 날려먹을수 있는데, 어떻게 방법이 없을까요?[/quote:2ny8b87t]

확장자는 도스시절의 산물로 파일의 종류를 파일명으로 구분하기 위해서 사용된 것이죠.
하지만 유닉스나 리눅스 계열에는 이것을 사용하지 않구요, 확장자만 바꾸면 다른 파일처럼 보일 수 있기 때문에,
사실 좋지도 않습니다.

파일명중 공백을 제거하는 것은 간단한 명령으로 가능합니다.
rename ‘s/ //g’ ./*

[quote="protochaos":22oo8chf]

확장자는 도스시절의 산물로 파일의 종류를 파일명으로 구분하기 위해서 사용된 것이죠.
하지만 유닉스나 리눅스 계열에는 이것을 사용하지 않구요, 확장자만 바꾸면 다른 파일처럼 보일 수 있기 때문에,
사실 좋지도 않습니다.

파일명중 공백을 제거하는 것은 간단한 명령으로 가능합니다.
rename ‘s/ //g’ ./*[/quote:22oo8chf]

그렇게 하면, "데비안 계열 우분투 .txt"라는 파일이 "데비안계열우분투.txt"로 바뀌게 됩니다.
저는 "데비안 계열 우분투 .txt"라는 파일을 "데비안 계열 우분투.txt"라는 파일로 바꾸고 싶습니다.

[quote="별님":p8zp8dgf][quote="protochaos":p8zp8dgf]

확장자는 도스시절의 산물로 파일의 종류를 파일명으로 구분하기 위해서 사용된 것이죠.
하지만 유닉스나 리눅스 계열에는 이것을 사용하지 않구요, 확장자만 바꾸면 다른 파일처럼 보일 수 있기 때문에,
사실 좋지도 않습니다.

파일명중 공백을 제거하는 것은 간단한 명령으로 가능합니다.
rename ‘s/ //g’ ./*[/quote:p8zp8dgf]

그렇게 하면, "데비안 계열 우분투 .txt"라는 파일이 "데비안계열우분투.txt"로 바뀌게 됩니다.
저는 "데비안 계열 우분투 .txt"라는 파일을 "데비안 계열 우분투.txt"라는 파일로 바꾸고 싶습니다.[/quote:p8zp8dgf]

그렇다면
rename ‘s/[ ]+././’ * 이렇게 해보세요.

[quote="protochaos":3k9l75ub]
그렇다면
rename ‘s/[ ]+././’ * 이렇게 해보세요.[/quote:3k9l75ub]

저도 그 방법은 생각해 보았는데, 그렇게 하면
"tx .t .txt"라는 파일은 "tx.t .txt"로 바뀌게 됩니다.

문자열의 가장 마지막 문자 바로 다음 영역부터 마지막 '.'까지의 영역이어야 합니다. 이떄, '.'의 뒤에는 다른 '.'이 없어야 합니다.
이걸 어떻게 식으로 표현해야할지 모르겠습니다.

그렇게 정교하게 하시려면 정규표현식을 정교하게 쓰시면 됩니다.
rename ‘s/[ ]+.([^.]+)$/.$1/’ *

[quote="protochaos":18qxqr7i]그렇게 정교하게 하시려면 정규표현식을 정교하게 쓰시면 됩니다.
rename ‘s/[ ]+.([^.]+)$/.$1/’ *[/quote:18qxqr7i]

감사합니다. 제대로 작동이 되네요!
그런데, 어떻게 돌아가는건 물어봐도 될까요?

공백이 한번이상 반복하는 .까지의 범위.
.뒤에서 .이 아닌 모든 문자
마지막까지

.$1는 뭔가요?

rename ‘s/[ ]+.([^.]+)$/.$1/’ *

s는 치환 명령으로 y명령과 비교할 수 있습니다.
s다음의 /는 패턴을 구분하기 위해 사용된것으로 굳이 /가 아니더라도 ,등을 사용할 수도 있습니다.
[ ]는 그냥 공백을 써도 되지만 구별하기 쉽게 하기 위해서 그렇게 쓴거구요.
+는 1번이상 일치 *는 0번이상 일치 {n,m}은 n~m번 일치
?는 0,1번 일치

[문자들]는 포함하는 문자집합
[^문자들]은 제외하는 문자집합
$는 문자열끝 ^는 문자열시작
()는 일치된 내용을 기억하라는 것이구요, ()이 여럿있을때 $1,$2…$9까지를 역참조로 사용할 수 있어요
원래는 \1,\2…\9이런식인데… rename에서는 경고가 나면서 $를 사용하라고 메시지가 나옵니다.
$0는 일치한 전체 문자열을 나타내겠지요.

예를 들어 "."을 기준으로 확장자와 파일명을 바꾸고자 한다면
s/^(.+).([^.]+)$/$2.$1/ 이런식으로 정규표현식을 써주면 됩니다.

perl 정규표현식의 치환명령의 사용법은
s{구분문자}패턴{구분문자}치환내용{구분문자}옵션

.$1은 그러니깐 공백들다음에 "."문자까지 읽어들였기 때문에… " .xxxxxxxx"이런식이 읽어 들인내용이 될것이고,
" ."을 "."으로 바꾸라는 것이고
$1은 첫번째 역참조한 문자열을 나타내는 것입니다.

감사합니다! 이제, 어떤 의미의 식인지 이해가 갑니다.