Bash 스크립트에서 확장자가 없는 파일을 선택하는 방법은 무엇입니까?

Bash 스크립트에서 확장자가 없는 파일을 선택하는 방법은 무엇입니까?

현재 디렉토리에 xinitrc, Alphabetsoup, ieat.pie 파일이 있다고 가정합니다. xinitrc 및 Alphabetsoup만 선택하려면 bash 스크립트가 필요합니다.

답변1

bash 확장 glob은 이름에 아무것도 없는 파일 +([^.])과 일치합니다 . .설정을 해제하지 않아야 합니다 shopt extglob(최신 bash 설치에서는 기본값이어야 함). 이 모드의 의미는 다음과 같습니다.

다음을 제외한 임의의 수(그러나 적어도 하나)의 문자.

모든 파일 이름을 배열에 넣을 수 있습니다.

NO_EXTENSION=( +([^.]) )

파일 이름을 인쇄할 수 있습니다.

printf "%s\n" +([^.])

또는 모두 유틸리티에 전달하십시오.

ls -- +([^.])

배열이 아닌 변수에 저장하려면 파일 이름에 공백이 없는지 확인해야 합니다. 이것을 확실히 확신한다면 다음과 같이 할 수 있습니다.

NO_EXTENSION=$(echo +([^.]))

배열의 경우와 달리 경로명 확장을 구현하려면 echo를 호출해야 합니다. 파일 이름의 특수 문자에 대해 걱정할 필요가 없으므로 이러한 목록에는 배열을 사용하는 것이 좋습니다.

답변2

다음 명령을 사용하여 이름에 마침표가 없는 작업 디렉터리의 파일 목록을 가져올 수 있습니다.

find . -maxdepth 1 ! -name "*.*"

.file및 을 일치시키려는 경우 UNIX에서 파일을 가질 수도 있지만 file그렇지 않은 file.ext경우 다음을 사용할 수 있습니다.

find . -maxdepth 1 ! -name "*.*" -o -name ".*[^.]*"

답변3

와 함께extglob옵션, 즉 패턴의 보완, 즉 이름이 패턴과 일치하지 않는 파일과 일치할 수 있습니다. 확장자가 있는 파일은 files 과 일치하므로 *.*현재 디렉터리에 확장자가 없는 파일은 다음과 같이 일치될 수 있습니다.

shopt -s extglob
somecommand !(*.*)

.도트 파일(이름이 로 시작하는 파일)은 포함되지 않습니다. 또한 일치시키고 두 번째 항목을 포함하지 않는 한 확장이 없는 것으로 처리하려면 .다음을 사용할 수 있습니다.

shopt -s extglob nullglob
somecommand !(*.*) .!(*.*)

또는

shopt -s dotglob extglob
somecommand !(?*.*)

답변4

아마도 당신은 이것을 찾고 있을 것입니다:

$ ls | grep -v '\.'

예:

$ ls
alphabetsoup  ieat.pie  xinitrc
$ ls | grep -v '\.'
alphabetsoup
xinitrc

관련 정보