다음 형식의 파일이 있습니다.
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 extglob
zsh -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