Find는 동일한 경로를 두 번 반환하지만 잘립니다.

Find는 동일한 경로를 두 번 반환하지만 잘립니다.

나는 다음 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.

관련 정보