저는 Unix를 처음 접하고 디렉터리(디렉터리 제외)의 모든 파일을 표시하려고 했기 때문에 ls -p | grep -v /
.
다음과 같은 목록이 표시됩니다.
Process1
Process2
Process3
︙
하지만 명령을 사용하면 ls -p | grep -v / | grep P*
일부 프로세스만 표시됩니다. 모든 프로세스를 표시하지 않는 이유는 무엇입니까?
편집하다
나는 소문자 p 대신 대문자 P를 사용하고 있다는 것을 깨달았습니다. 이것은 실수입니다.
답변1
두 번째 명령에서는 grep P*
셸에 일치하는 파일 이름을 묻는 메시지가 표시됩니다. 즉, 해당 문자로 시작하는 모든 파일로 P*
확장됩니다 .P*
P
set -x
실행된 내용을 확인하기 위해 쉘에서 사용됩니다(추적을 끈 상태에서 set +x
).실제로는 내가 무엇을 하고 있는지 확인하기 위해 대화형 셸 세션에서 기본적으로 추적이 켜져 있습니다..
큰따옴표만으로는 P*
이 문제를 해결할 수 없습니다.정규식 P*
또한 및 같은 파일 이름 APPLE
과 file.PP
실제로 hello_world.c
다른 모든 파일 이름과 일치 P*
하며 파일 이름과도 일치합니다.아니요 P
바로 거기.
일반적으로 말하면,출력을 구문 분석하면 안 됩니다.ls
그러나 다음은 문자로 시작하는 파일 목록(디렉토리가 아닌)을 얻는 더 좋은 방법입니다 P
.
$ find . -type f -maxdepth 1 -name "P*"
-type f
현재 디렉터리( ) .
에서 이름이 P
( )로 -name "P*"
시작하는 모든 일반 파일( )을 찾습니다 . 이 옵션은 이 디렉터리로 -maxdepth 1
제한됩니다 . find
그렇지 않으면 하위 디렉터리에도 반복됩니다.
find
당신이하고있는 일을 하십시오 grep -v /
.제거하다대신 목록의 디렉토리선택하다일반 파일:
$ find . ! -type d -maxdepth 1 -name "P*"
소켓 등과 같은 비정규 파일도 찾습니다. 일부 쉘에서는 이스케이프 또는 인용이 필요합니다 !
. 즉,
$ find . "!" -type d -maxdepth 1 -name "P*"
또는
$ find . \! -type d -maxdepth 1 -name "P*"
P*
쉘이 확장하지 않도록 인용은 중요합니다.
답변2
이것"P*"
뭔가와 일치할 것입니다(또는아니요) grep이 매개변수를 보기 전에 쉘에서. 인용하면 더 나은 결과를 얻을 수 있지만 grep은 와일드카드가 아닌 정규식과 일치한다는 점을 기억하십시오.
따라서 "P"만 입력하면 됩니다. 정규식이므로 *
다음 문자를 허용하기 위해 별표가 필요하지 않습니다."P"
일치시키려면(grep은 기본적으로 이를 무시합니다):
ls -p | grep -v / | grep "P"
또는
ls -p | grep -v / | grep '^P'
변경된 질문에 대해 후속 조치를 취하고 대소문자를 무시하려면 -i
grep 옵션을 사용하십시오.
ls -p | grep -v / | grep -i '^P'
추가 자료:
- grep - 파일에서 패턴 검색
-i
대소문자에 관계없이 검색에서 패턴 일치를 수행합니다. XBD를 참조하세요.정규식 일반 요구 사항. - ls - 디렉토리 내용 나열
-p
('/'
)를 각 파일 이름 뒤에 입력합니다(파일이 디렉터리인 경우).