Unix에서 find를 사용하여 기본 파일 이름을 인쇄하는 방법은 무엇입니까?

Unix에서 find를 사용하여 기본 파일 이름을 인쇄하는 방법은 무엇입니까?

나는 기본 파일 이름을 인쇄하기 위해 Unix에서 find를 사용하려고 했습니다. 단순히 파일 이름을 인쇄하기 위해 내가 사용한 명령은 다음과 같습니다.

find . -type f -name \*.out -print

전체 경로에 한정된 경로 이름을 인쇄합니다. 하지만 저는 기본 파일 이름만 원합니다. 그래서 나는 다음 명령을 시도했습니다.

find . -type f -name \*.out -exec basename {}

하지만 오류가 발생하고 표시됩니다.

find: incomplete statement

이 문제를 극복할 수 있도록 도와주세요.

답변1

;기본 표현식을 종료하는 문자가 누락되었습니다 (참조:POSIX 조회):

find . -type f -name \*.out -exec basename {} ';'

이스케이프하거나 인용해야 하는 이유 ;는 쉘 목록 구분 기호이기 때문입니다. 쉘이 문자 그대로 처리하도록 해야 합니다. \;, ';'아니면 ";"모든 것이 괜찮습니다.

하지만 이 솔루션은 발견된 모든 파일을 호출하므로 basename속도가 느려집니다. 파일 이름에 개행 문자가 포함되어 있지 않으면 다음을 수행할 수 있습니다.

find . -type f -name '*.out' | sed -e 's#.*/##'

당신이 가지고 있다면GNU coreutils 버전 >= 8.16, 또는 OSX를 사용하는 경우 다음을 사용할 수 있습니다.기본 이름-a:

find . -type f -name '*.out' -exec basename -a -- {} +

답변2

종료 명령 끝에 세미콜론이 누락되었습니다 -exec.

find . -type f -name \*.out -exec basename {} \;

그러나 명령은 외부 프로세스를 포크하고 basename일치할 때마다 호출하기 때문에 매우 느리게 실행됩니다. 검색 결과가 이 -printf옵션을 지원하는 경우 해당 옵션을 사용할 수 있습니다.

find . -type f -name \*.out -printf '%f\n'

답변3

당신은 왼쪽\;

 find . -type f -name \*.out -exec basename {} \;

파일 경로에 개행 문자가 포함되어 있지 않으면 다음을 사용할 수도 있습니다 awk.

find . -type f -name \*.out -print | awk -F "/" '{print $NF}'

관련 정보