나는 다음 find
명령을 실행하고 있습니다 :
find $HOME * -depth -type d -iname *bowtie* | grep "bowtie*-*1[^2]"
내 예상 결과는 다음과 같습니다
/home/user/Documents/scripts/bowtie1.3.0-linux-x86_64
/home/user/Documents/scripts/bowtie-1.3.0-linux-x86_64
그러나 다음을 반환합니다.
/home/user/Documents/scripts/bowtie1.3.0-linux-x86_64
/home/user/Documents/scripts/bowtie-1.3.0-linux-x86_64
Documents/scripts/bowtie1.3.0-linux-x86_64
Documents/scripts/bowtie-1.3.0-linux-x86_64
find
처음 두 결과만 표시하도록 명령을 수정하려면 어떻게 해야 합니까 ?
답변1
find
여러 개의 동일한 검색 경로를 사용하여 실행 중 입니다 . 생성된 이름 $HOME
과 함께 사용하고 있습니다 . *
분명히 그것은 *
당신이 찾고 있는 이름을 포함한 일부 디렉토리로 확장됩니다.
제안:
find "$HOME" -type d -name 'bowtie*1.[!2]*'
위의 방법 을 사용하면 테스트를 보다 창의적으로 사용하여 grep
마음의 부담을 덜 수 있습니다. -name
호출하기 전에 현재 디렉터리를 기준으로 확장되어서는 안 되는 스키마를 참조해야 합니다 find
.
이 패턴은 로 시작 bowtie
하고 를 포함 하는 이름 1.n
과 그렇지 n
않은 이름과 일치합니다 2
. 대신 [!2]
, [13-9]
force를 사용하여 단지 모든 문자인 Except Except가 2
아니라 정수 Except Except 를 일치시킬 수 있습니다 2
.
답변2
그 이유는 다음과 같은 두 가지 매개변수를 전달하기 때문입니다 find
.
- 당신의
$HOME
디렉토리 *
이는 쉘에 의해 현재 디렉토리에 있는 파일 및 디렉토리의 전체 목록으로 확장됩니다$HOME
.
따라서 먼저 다음과 같은 것을 find
검색 하고 반환 한 다음 사용자가 제공한 파일 및 디렉터리 목록을 검색합니다. 이는 셸에 의해 확장되므로 경로입니다.$HOME
/home/user/foo
비교적현재 디렉토리로 이동하므로 선행이 없으므로 /home/user
다음과 같은 것을 반환합니다 foo
.