![grep을 사용하여 숫자로 폴더 필터링](https://rvso.com/image/1618326/grep%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%88%AB%EC%9E%90%EB%A1%9C%20%ED%8F%B4%EB%8D%94%20%ED%95%84%ED%84%B0%EB%A7%81.png)
필터링된 숫자가 있는 폴더만 나열하려고 했습니다.ls -1
(옵션 -1
은한 줄에 하나의 파일 나열) grep을 통해(find도 가능하다는 것을 알고 있지만 이 예에서는 grep을 고수하고 싶습니다)
폴더는
PC:test user$ ls -1
1184
36
69929
7
9907
이제 이것이 다른 출력으로 얻는 것입니다 ...
이 것: 왜 9907이 거기에 있는지 모르겠습니다. 한 자리 숫자 7 폴더만 있으면 이해가 되니까요.
PC:test user$ ls -1 | grep [0-9]
7
9907
7이 빠졌네요. .
평균이 2 이상인가요?
PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907
이것은 거기에 있는 숫자가 있는 모든 항목과 일치한다는 뜻인가요?
PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907
따옴표로 묶으면 예상대로 작동하는데 왜 그럴까요? 와 동등합니까 [0-9].*
?
PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
답변1
"파일 이름 대체" 또는 "경로 이름 확장" 또는 "globbing"
명령을 입력하면 여러 단계의 잠재적 변형이 적용됩니다.~ 전에grep과 같은 모든 프로그램이 호출됩니다.
[
일부 쉘에서는 특수 문자입니다.
$ echo [0-9]
7
여기서 일어나는 일은 쉘이 파일 이름 선택으로 0-9를 확장하고 "7" 파일을 찾아서 "7"을 grep에 전달한다는 것입니다. 따라서 grep은 파일 이름에 "7"이 포함된 파일 이름을 찾습니다.
[
쉘이 아닌 grep으로 처리하려면 문자열을 인용하거나 쉘을 속여 표현식을 다르게 구문 분석해야 합니다 .
$ echo [0-9].
[0-9].
인용을 권장합니다.
man bash
(검색 for
) man test
및 151페이지 도 참조하세요 .이것
정규 표현식
정규식에서는 .
"모든 단일 문자"를 의미합니다. 따라서 [0-9].
숫자 뒤에 단일 문자가 오는 것을 의미합니다. 파일 이름에는 7
후자가 없습니다.
grep이 한 자리 파일 이름을 찾도록 하려면 표현식을 줄의 시작과 끝 모두에 고정해야 합니다.
$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
$ ls -1 | grep '^[0-9]$'
7
아, 컴퓨터를 부숴버렸어
부주의하게 특수 문자를 사용하면 온갖 흥미로운 결과가 나옵니다.
$ ls -1 > x
$ grep *
x:1184
생각해 보면 이것은 더 명확해질 것입니다.
$ ls -1
1184
36
69929
7
9907
x
$ echo *
1184 36 69929 7 9907 x
이제 와 rm
를 추가하기만 sudo
하면 귀하의 경력을 극적으로 변화시킬 수 있는 경험을 할 수 있습니다.