9개의 파일이 있는 디렉토리가 있습니다.
- 1은 다음으로 끝납니다
.bat
- 2는 다음으로 끝납니다
.bak
- 4는 다음으로 끝납니다
.txt
- 2는 다음으로 끝납니다
.xtxt
.txt
제 질문은 마침표 없이 로 끝나는 파일만 나열하려면 어떻게 해야 합니까 ? 그래서 .txt
명령을 사용하지 않고 엔딩 4를 표시하고 싶습니다.
ls *.txt
마침표가 있는 파일을 필터링하고 싶지 않기 때문입니다. 지금 와일드카드에 대해 배우고 있으므로 여기서는 와일드카드를 사용합니다. 어떻게든 그 명령을 사용해야 할 것 같은데 !
, 어디에 사용해야 할지 모르겠습니다.
답변1
난 이해가 안 돼요왜.
.어쨌든 포함 대신 특정 문자 클래스를 사용할 수 있지만 .
디렉토리의 다른 클래스는 사용할 수 없습니다. 이 목적에 적합한 후보는 다음과 같습니다 [[:punct:]]
.
LC_ALL=C ls -- *[[:punct:]]txt
C
이에 의존하는 문자 클래스 로 로케일을 변경 하고 올바른 파일로 시작하는 모든 파일을 나열하는 옵션을 --
추가 했습니다.ls
-
정의:
`[:punct:]'
Punctuation characters; in the `C' locale and ASCII character
encoding, this is `! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \
] ^ _ ` { | } ~'.
답변2
Bash 셸을 사용하는 경우:
shopt -s extglob
ls !(*xtxt|*bak|*bat)
답변3
[!x]txt
로 끝나는 모든 파일을 나열 하는 데 사용되지만 txt
다음으로 끝나는 파일은 제외됩니다 xtxt
.
ls ./*[!x]txt
(있는 경우 쉘에서 히스토리 확장을 꺼야 할 수도 있습니다 event not found
.)
또는 ASCII 코드를 사용하여 포인트를 표시합니다. 예:
ls ./*$'\x2E'txt
또는
ls ./*$'\056'txt
답변4
IMO 운동에 대한 더 일반적인 대답은 입니다 ls *[^x]txt
.
[!x]
나는 그것이 잘 작동한다는 사실에 놀랐습니다 . 나는 !
히스토리 완성을 강타하는 데 익숙하고 그것은 여전히 큰따옴표 안의 특수 문자이기 때문에 이상한 문제를 일으키므로 그것을 피하려고 노력합니다!
# echo 1
1
# !echo
echo 1
1
# "!echo"
echo 1
1
# echo "the!echo"
echo theecho 1
theecho 1
test
C와 같은 조건문( ) [ ! $condition ]
에서 논리적 부정 에 사용되는 것으로 알고 있습니다 . 이것을 사용하면 ^
정규식에서도 동일하다는 장점이 있습니다 ls | grep [^x]txt$
. ( $
패턴을 줄 끝에 "고정"합니다).