디렉토리에서 파일을 필터링하거나 추출하는 방법은 무엇입니까?

디렉토리에서 파일을 필터링하거나 추출하는 방법은 무엇입니까?

다음 형식의 파일이 있습니다.

abc_abc_abc   
abc_abc_abc.1    
abc_bca_bca    
abc_bca_bca.1    
abc_bca_bca.2    
abc_cab    
abc

2개의 밑줄이 있는 파일을 가져오고 .(점) 및 단일 밑줄과 같은 다른 파일을 제외하고 싶습니다.

결과는 다음과 같습니다.

abc_abc_abc
abc_bca_bca

답변1

당신은 그것을 사용할 수 있습니다 find:

find . -name "*_*_*" -not -name "*.*"

하위 디렉터리에서도 검색됩니다. 이를 원하지 않는 경우 일반 파일만 원한다면 추가 -maxdepth 1하십시오 .-type f

find . -maxdepth 1 -type f -name "*_*_*" -not -name "*.*"

이전 .-printf "%P\n"./

답변2

를 사용 ksh하거나 일부 이중 부정을 사용합니다(여기에서는 밑줄이 3개 이상인 파일도 제외한다고 가정).bash -O extglobzsh -o kshglob

printf '%s\n' !(!(*_*_*)|*_*_*_*|*.*)

zsh -o extendedglob그것 으로~ 와는 별개로운영자:

printf '%s\n' *_*_*~(*_*_*_*|*.*)

또는 zsh기본 부정 연산자를 사용하세요.

printf '%s\n' ^(^*_*_*|*_*_*_*|*.*)

밑줄이 2개 이상 포함된 파일을 원할 경우 위의 항목을 각각 !(!(*_*_*)|*.*)또는 *_*_*~*.*또는 로 바꾸세요.^(^*_*_*|*.*)

다른 접근 방식은 다음과 같습니다 !(*[._]*)_!(*[._]*)_!(*[._]*)( 3개 이상의 밑줄을 허용 [_.]하도록 대체)..

답변3

간단히 말해서, bash(또는 배열을 지원하는 셸)에서는 다음과 같습니다.

files=(???_???_???)

이것은 ?와일드카드 문자를 사용하여 표시된 대로 이름이 지정된 파일을 선택합니다. 여기에는 3자, 밑줄, 3자, 밑줄, 3자가 포함됩니다. xyz_qrs_t.1단, .

좀 더 세련된 것은 다음과 같습니다.

files=([^._][^._][^._]_[^._][^._][^._]_[^._][^._][^._])

...사용하는 것[^ ... ] 와일드카드 구문. 각 문자에는 [^._]하나의 문자가 필요합니다.아니요마침표 또는 밑줄. Mix 에는 3개의 배치 3개를 구분하는 2개의 밑줄이 있습니다 [^._].

이를 통해 반복하십시오.

for f in "${files[@]}"; do printf "File: %s\n" "$f"; done

관련 정보