grep을 사용하여 숫자로 폴더 필터링

grep을 사용하여 숫자로 폴더 필터링

필터링된 숫자가 있는 폴더만 나열하려고 했습니다.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하면 귀하의 경력을 극적으로 변화시킬 수 있는 경험을 할 수 있습니다.

관련 정보