나는 기본 파일 이름을 인쇄하기 위해 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}'