디렉토리에있는 파일의 경우 echo 파일 이름 만 (경로 없음)


98

for 루프로 디렉토리를 반복하는 경우 파일의 파일 이름 만 에코하려면 어떻게해야합니까?

for filename in /home/user/*
do
  echo $filename
done;

파일 이름으로 전체 경로를 가져옵니다. 파일 이름 만 알고 싶습니다.

답변:


166

네이티브 bash솔루션 을 원하는 경우

for file in /home/user/*; do
  echo "${file##*/}"
done

위는 셸 고유의 매개 변수 확장 을 사용 하며 다음과 같은 외부 바이너리에 대한 호출이 필요하지 않습니다.basename

그러나 사용하는 것이 좋습니다. find

find /home/user -type f -printf "%f\n"

9
좋은 대답입니다. 매개 변수 확장에 대해 더 알고 싶은 분들을 위해 : wiki.bash-hackers.org/syntax/pe#substring_removal
DougW

1
-printf : 알 수없는 기본 또는 운영자 => unix.stackexchange.com/a/272493/72893
Nobita

2
공백이있는 파일 이름을 지원 ${file##*/}하려면 "${file##*/}"로 변경 하십시오 (예 : "spaces.txt가있는 파일 이름").
WinEunuuchs2Unix

echo "$ {file ## * /}"은 빈 문자열을 반환합니다
Alessandro C

47

그냥 사용하십시오 basename:

echo `basename "$filename"`

$ filename에 공백 등이 포함 된 경우 따옴표가 필요합니다.


3
매개 변수 확장을 사용하는 것이 더 좋으며 외부 바이너리에 대한 호출이 필요하지 않습니다.
SiegeX

5
Btw,``는 더 이상 사용되지 않습니다. $()Oli처럼 사용하는 것이 더 좋습니다
SiegeX

1
이 오래된 답변에 대해 댓글을 달아서 죄송하지만 공간이있는 파일에는 basename이 올바르게 작동하지 않습니다. 예 : pwd 출력 : /test 1, basename $(pwd)출력 : test. OS X 및 Ubuntu Server (14.04)에서 테스트되었습니다. @SiegeX가 권장하는 네이티브 bash 솔루션이 저에게 효과적이었습니다.
Marko Grešak 2014

@ MarkoGrešak basename "$(pwd)"대신 사용하십시오 .
YoungFrog 2015-08-12

@YoungFrog는 입력 해 주셔서 감사합니다. 그러나 그것은 9 개월 전이었습니다. 또한 $PWD명령을 실행하는 대신 변수를 사용하는 것이 좋습니다 .
Marko Grešak

15

사용 basename:

echo $(basename /foo/bar/stuff)

왜 사용 echo합니까? basename이미 결과를 인쇄합니다. echo서브 쉘을 인용하지 않으면 결과가 망가질 수도 있습니다. 예 : echo $(basename path/with\ \ spaces)잘못 인쇄됩니다 with spaces(공백 하나만).
Socowi

7

또 다른 방법은 ls디렉토리 내의 파일 목록을 읽을 때 사용 하여 원하는 것을 제공하는 것입니다. 즉 "파일 이름 만"입니다. 전체 파일 경로를 읽은 다음 for 루프 본문에서 "파일 이름"구성 요소를 추출하는 것과 반대입니다.

원본을 따르는 아래 예 :

for filename in $(ls /home/user/)
do
  echo $filename
done;

파일과 동일한 디렉토리에서 스크립트를 실행하는 경우 다음과 같이됩니다.

for filename in $(ls)
do
  echo $filename
done;

1
ls*일반적으로 확장되지 않는 도트 파일을 포함합니다 . for f in $(...) ...IFS를 설정하지 않는 한 파일 이름에 공백이 포함 된 경우 에도 실패하고, -f / -o noglob을 설정하지 않는 한 파일 이름에 glob 문자가 포함되어 있으면 실패 할 수 있으며, echo파일 이름이 하이픈 + 문자이거나 백 슬래시를 포함하는 경우 시스템 또는 셸에 따라 실패 할 수 있습니다. OTOH ls -1 /path/to/dir는 자체적으로 각 파일 이름을 한 줄에 안정적으로 인쇄하여 도트 파일 차이를 모듈로합니다.
dave_thompson_085

0

파일 이름 만 원하는 경우 :

for file in /home/user/*; do       
  f=$(echo "${file##*/}");
  filename=$(echo $f| cut  -d'.' -f 1); #file has extension, it return only filename
  echo $filename
done

cut명령에 대한 자세한 내용 은 여기를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.