폴더 내의 모든 파일이름을 변경하려고 명령어를 짜봤는데, 작동이 안됩니다

[code:32gwn40k]find "pwd" -not ( -type d -name "." -prune ) -type d -exec rename 's/^[[:space:]]//’ {}/* ; -exec rename 's/[[:space:]]$//’ {}/ ;[/code:32gwn40k]
이렇게 바꾸고, 저렇게 바꾸고 해봐도, 도통 작동할 생각을 안하네요.

sed 명령어로 바꿔서 표현하면, 분명 파일 내의 문자열에 대해선 확실히 작동합니다.

[code:32gwn40k]sed -e ‘s/^[[:space:]]//g’ -e 's/[[:space:]]$//g’ test.txt[/code:32gwn40k]
그런데, rename으로 표현하면 작동이 안되네요 ㅜㅜ
수시간째 삽질해도 원인을 모르겠어 질문합니다.

[code:1tc7akc6]find "pwd" -not ( -type d -name ".*" -prune ) -type d[/code:1tc7akc6]
이렇게 하니 디렉토리명 만 출력이 되네요.

-type d를 -type f로 바꾸면 파일을 목록이 나오네요.

하위디렉토리 포함 모든 파일명 공백제거 (디렉토리명은 그대로)

[code:2j7gw4lc]
PATH=/usr/bin find . -type f -execdir rename ‘s/\s+//g’ {} ;
[/code:2j7gw4lc]
execdir 옵션은 해당디렉토리로 이동 후 명령을 실행합니다.
다만 보안상 이유로 PATH에 .(현재디렉토리)이 포함되지 않아야 하기에
PATH에 .이 포함되었다면 PATH환경변수를 바꿔서 실행해야 합니다.

만약 하위디렉토리를 포함하지 않고, 디렉토리내의 모든 파일을 대상으로 하고 싶다면

[code:2j7gw4lc]
PATH=/usr/bin find . -mindepth 1 -maxdepth 1 -type f -execdir rename ‘s/\s+//g’ {} ;
[/code:2j7gw4lc]
이렇게 하시면 됩니다.

하위폴더를 검색제외하거나 포함하거나, 특정폴더만 찾거나 하는걸 질문하는게 아닙니다.
rename 명령어의 이상작동에 대한 질문입니다.

정규식을 지키고 있음에도 rename명령어는 정규식을 인식하지 않기에, 해결방법이나 오류의 이유가 무엇인지 묻고 있습니다.

sed 프로그램과 mv를 for,while구문과 조합하시면 됩니다.
단점은 시간이 오래걸립니다.

[code:3s2hj653]
for i in $(find "pwd" ( ! -name ‘.’ -o ! ( -name '.’ -prune ) ) -a ! -type d -print)
do
d=$(dirname "$i")
f=$(basename "$i" | sed -e ‘s/^[[:space:]]//’ -e 's/[[:space:]]$//’)
mv -Tv "$i" "$d/$f"
done

count=1

cd "pwd"

while :
do

file=$(find . -mindepth $count -prune ! -path ‘/.’ -type d)
if [ ! "$file" ]
then
break
fi

for i in $file
do
d=$(dirname "$i")
f=$(basename "$i" | sed -e ‘s/^[[:space:]]//’ -e 's/[[:space:]]$//’)
mv -Tv "$i" "$d/$f"
done

count=$(expr $count + 1)

done[/code:3s2hj653]

[quote="별님":274qn5oi]하위폴더를 검색제외하거나 포함하거나, 특정폴더만 찾거나 하는걸 질문하는게 아닙니다.
rename 명령어의 이상작동에 대한 질문입니다.

정규식을 지키고 있음에도 rename명령어는 정규식을 인식하지 않기에, 해결방법이나 오류의 이유가 무엇인지 묻고 있습니다.[/quote:274qn5oi]

find . -name "." 해보시고
find . -name "
"와 비교해보세요.

find에서 기본적으로 사용되는 표현식은 정규표현식이 아니라, pathname expansion입니다.
man bash
/pathname expansion으로 검색해보세요

find에서 정규표현식을 사용하고 싶으시면 -regex -regextype 옵션을 사용하세요

그리고, rename에서 사용되는 표현식은 펄정규표현식입니다. 그러니까 sed보다 더 확장된 표현식입니다.

rename ‘s/(\s+)//g’ [[:space:]] 이런식으로 사용하세요.
이렇게 사용할때, 첫번째인수는 rename에서 사용하는 펄정규표현식이고,
두번째에 사용되어진 것은 rename의 대상으로, 쉘에서 rename에 매개변수로 넘기기 때문에…
쉘에서 pathname expansion을 분석하여 해당 되는 파일 전체가 rename의 매개변수로 넘어갑니다.
그러니까 "a b" "c d"라는 파일이 있다면, "a b\nc d" 혹은 "a b;c d"이렇게 해서 하나의 매개변수로 넘어가는 것이
아니라, "a b" "c d"로 두개가 매개변수로 전달됩니다.
rename이 처리하는것이 아니라 쉘에서 넘기는 것입니다.