2012-11-01 2 views
1

이 코드는 쉘 스크립트에 있습니다. 파일 이름에 점 (.)을 포함한 모든 확장자를 제거하고 그 이름을 반환합니다 (예 : /home/user/filename). 그러나 문제는 디렉터리 구조를 제거하고이 파일 이름을 filename과 같이 반환하기를 원한다는 것입니다.이동 파일의 정규식

다음은 확장 프로그램 만 제거하는 코드입니다.

filename="/home/user/filename.php.txt.doc"  
newname=${filename%%.*} 
echo $newname 
/home/user/filename 

디렉토리 확장자가 아닌 파일 이름 만 가져 오는 방법이 있습니까?

filename 

감사

답변

3

파일의 이름을 얻을 수 "${filename##*/}"을보십시오.

$ filename="/home/user/filename.php.txt.doc"  
$ newname=${filename%%.*} 
$ newname=${newname##*/} 
$ echo $newname 
filename 

또는 basename를 사용

$ filename="/home/user/filename.php.txt.doc"  
$ newname="$(basename ${filename%%.*})" 
$ echo $newname 

을 또한 단일 나오지 명령으로 할 수 있지만, 조금 읽을 수없는, 그래서 않을 것 :

$ sed 's|.*/\([^\.]*\).*|\1|g' <<< "$filename" 
filename 
+0

감사합니다. 귀하의 코드는 큰 성공을 거두었습니다. 기고에 대한 다른 사람들에게 감사드립니다 :) –

0

awk을 사용하면 마지막 필드 filename을 필드 구분 기호 /으로 가져올 수 있습니다.

newname=$(echo "$newname" | awk -F"/" '{print $NF}') 

코드이 줄을 추가 :

filename="/home/user/filename.php.txt.doc"  
newname=${filename%%.*} 
newname=$(echo "$newname" | awk -F"/" '{print $NF}') 
echo $namename 

출력 :

filename 
+0

Ugh. 그것이 쉘에서 할 수있을 때 awk로 포크하는 이유는 무엇입니까? – Jens

+0

그리고 '에코'하지 마세요. 대신 herestring을 사용하십시오. – dogbane

+0

쉘 스크립트 초보자의 관점 =)을 제공하고 있지만 지금 다른 솔루션을보고 새로운 것을 배우고 있습니다! –

0
newname=$(basename "$filename") 
newname=${newname%%.*} 
echo $newname 
filename 
관련 문제