답변:
네이티브 bash
솔루션 을 원하는 경우
for file in /home/user/*; do
echo "${file##*/}"
done
위는 셸 고유의 매개 변수 확장 을 사용 하며 다음과 같은 외부 바이너리에 대한 호출이 필요하지 않습니다.basename
그러나 사용하는 것이 좋습니다. find
find /home/user -type f -printf "%f\n"
${file##*/}
하려면 "${file##*/}"
로 변경 하십시오 (예 : "spaces.txt가있는 파일 이름").
그냥 사용하십시오 basename
:
echo `basename "$filename"`
$ filename에 공백 등이 포함 된 경우 따옴표가 필요합니다.
$()
Oli처럼 사용하는 것이 더 좋습니다
/test 1
, basename $(pwd)
출력 : test
. OS X 및 Ubuntu Server (14.04)에서 테스트되었습니다. @SiegeX가 권장하는 네이티브 bash 솔루션이 저에게 효과적이었습니다.
basename "$(pwd)"
대신 사용하십시오 .
$PWD
명령을 실행하는 대신 변수를 사용하는 것이 좋습니다 .
또 다른 방법은 ls
디렉토리 내의 파일 목록을 읽을 때 사용 하여 원하는 것을 제공하는 것입니다. 즉 "파일 이름 만"입니다. 전체 파일 경로를 읽은 다음 for 루프 본문에서 "파일 이름"구성 요소를 추출하는 것과 반대입니다.
원본을 따르는 아래 예 :
for filename in $(ls /home/user/)
do
echo $filename
done;
파일과 동일한 디렉토리에서 스크립트를 실행하는 경우 다음과 같이됩니다.
for filename in $(ls)
do
echo $filename
done;
ls
*
일반적으로 확장되지 않는 도트 파일을 포함합니다 . for f in $(...) ...
IFS를 설정하지 않는 한 파일 이름에 공백이 포함 된 경우 에도 실패하고, -f / -o noglob을 설정하지 않는 한 파일 이름에 glob 문자가 포함되어 있으면 실패 할 수 있으며, echo
파일 이름이 하이픈 + 문자이거나 백 슬래시를 포함하는 경우 시스템 또는 셸에 따라 실패 할 수 있습니다. OTOH ls -1 /path/to/dir
는 자체적으로 각 파일 이름을 한 줄에 안정적으로 인쇄하여 도트 파일 차이를 모듈로합니다.