Bash 패턴은 디렉터리를 제외한 모든 파일과 일치합니다.

Bash 패턴은 디렉터리를 제외한 모든 파일과 일치합니다.

Bash에서 하위 디렉터리를 제외하고 현재 디렉터리의 모든 항목과 일치하는 패턴을 지정하는 방법. 패턴이 */모든 하위 디렉터리와 일치한다는 점을 고려하여 다음을 시도했습니다(extglob 열기).

$ echo !(*/)

그러나 그것은 작동하지 않았습니다.

답변1

find . -maxdepth 1 ! -type d

세부 사항:

  • -maxdepth 1현재 디렉터리로 검색 제한

  • ! -type d디렉토리 제거

답변2

디렉터리를 일치시키는 이유는 */궁극적으로 /일치하는 디렉터리를 제한하기 위한 것입니다. 이 효과는 패턴 뒤에 있을 때만 발동되며 괄호 안에는 사용할 /수 없습니다 . Bash에는 원하는 작업을 수행할 수 있는 내장 기능이 없습니다./!(*/)

모든 파일을 반복하여 배열을 만들 수 있습니다.

non_directories=()
for x in *; do
  [ -d "$x" ] || non_directories+=("$x")
done
somecommand "${non_directories[@]}"

find모든 파일에 대해 명령을 실행하려면 를 사용할 수도 있습니다. 찾기 구현이 이를 지원하는 경우(GNU, BSD, BusyBox), -mindepth및를 사용하여 -maxdepth현재 디렉터리의 항목( ./접두사 포함)만 나열합니다. ! -name '.*'정말로 생략하려는 경우 도트 파일을 생략하는 데 사용됩니다 .

find . -mindepth 1 -maxdepth 1 ! -type d -exec somecommand {} +

POSIX 만 가정할 수 있는 경우 재귀를 피하기 위해 find사용하십시오 .-prune

find . -name . -o -type d -prune -o -exec somecommand {} +

find출력을 배열 변수에 채우는 경우 구문 분석된 출력에는 find파일 이름에 대한 추가 가정이 필요하다는 점에 유의하십시오. 루프를 사용하는 것이 더 좋습니다.

zsh에서는 사용할 수 있습니다글로벌 예선: *(^/)또는 *(.)일반 파일만 일치합니다.

답변3

조금 장황하지만:

for f in *; do if [ ! -d "$f" ]; then echo "$f"; fi; done

-d파일 테스트 연산자인수가 디렉터리인지 확인하세요.

위의 공식은 다음과 같이 단순화될 수도 있습니다.

for f in *; do [ ! -d "$f" ] && echo "$f"; done

답변4

두 가지 옵션(파일 시스템 속성 제외를 기반으로 한 bash globbing) 또는 디렉터리의 파일만 표시하는 접근 방식 중 무엇을 구현하려는지 잘 모르겠습니다.

첫 번째라면 이것이 가능한지 잘 모르겠습니다. 전역 변수는 단지 확장자일 뿐이며 파일 이름은 모든 디렉터리의 기본입니다. bash 자체는 파일 이름이나 디렉터리 이름을 구별하지 않습니다.

두 번째 답변이 이미 2개 있으면 다른 답변에는 ls를 사용하세요.

ls -dF * | grep -v "/$"  

관련 정보