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 "/$"