와일드카드가 포함된 이 명령을 어떻게 grep합니까?
그렙 어떻게 해?표준 에러?
grep은 아무것도 하지 않는 것 같습니다:
$ less /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/* | grep "Not a file"
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/truffle is a directory
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/wunderline is a directory
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/yo is a directory
이것은 less를 매우 해악하게 사용하는 것이므로 아마도 또 다른 질문을 해볼 가치가 있을 것입니다. 그러나 제 목적은 이 디렉토리에서 깨진 심볼릭 링크를 찾는 것입니다. 공교롭게도 is a directory
유효하면 Not a file or directory
유효하지 않으면 더 적은 양이 인쇄됩니다. 와일드카드 연산자 stderr 에 대한 나의 이해 부족을 보여주기 때문에 어쨌든 물어볼 가치가 있다고 생각했습니다 .
답변1
와일드카드는 그것과 아무 관련이 없으며 grep
, grep
파이프로 연결된 내용만 볼 수 있습니다. 와일드카드는 쉘에 의해 확장되고 확장된 파일 목록은 전달됩니다 less
. 따라서 이 질문은 그것과 전혀 관련이 없습니다 grep
.
즉, 깨진 링크를 찾고 있다면 다음을 수행할 수 있습니다.
for f in /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/*; do
[ -e $(readlink -f "$f") ] || echo "$f";
done
이는 링크의 모든 파일과 디렉터리를 반복하여 /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/
대상이 존재하는지 확인하고( readlink
파일이 링크가 아닌 경우 iot를 실행하는 파일 이름을 인쇄), 존재하지 않으면 이름을 인쇄합니다.
나에게 더 나은 솔루션방금 배웠어예:
find /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/ -xtype l
이 경우 -xtype
링크의 대상이 링크인지 테스트하게 되므로 댕글링 링크에 대해서만 동작합니다.
답변2
@SatoKatsura가 그의 의견에서 지적했듯이 less
grep의 (해킹) 사용법은 로 출력 stderr
하고 grep에서 읽는 것입니다. 이는 죽은 심볼릭 링크를 찾는 실제 작업에는 좋지 않은 솔루션이지만 stdout
리디렉션을 통해 작동할 수 있습니다.stderr
stdout
less ~/.nvm/versions/node/v5.5.0/lib/node_modules/* 2>&1 | grep "Not a file"