명령줄에 패턴이 제공되면 찾기가 반복되지 않습니다.

명령줄에 패턴이 제공되면 찾기가 반복되지 않습니다.

소스 트리를 상상해 보세요. xml 파일은 어디에나 있습니다.

그러나 트리의 루트에 XYZ.xml이 있으므로 내 xml 파일을 찾을 수 없습니다.

find -iname *.xml

반품

./XYZ.xml

바꾸다

./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml

답변1

find -iname '*.xml'

그렇지 않으면 쉘이 *.xml로 확장 XYZ.xml되고 실제 실행되는 명령은 다음과 같습니다.

find -iname XYZ.xml

현재 디렉토리에 XML 파일이 없을 때 작동하는 이유는 일반적으로 쉘이 일치하지 않는 와일드카드를 확장하지 않기 때문입니다. 일반적으로 셸 외부의 프로그램(예 find: tar, , 등) 에 의해 와일드카드 문자를 확장하려는 경우 scp셸이 자체적으로 확장하려고 시도하지 않도록 해당 문자를 인용해야 합니다.

답변2

다음과 같이 자신의 주장을 인용해야 합니다.

find ./ -name '*.xml'

이런 방식으로 쉘에 의해 확장되지 않고 find로 전달된 다음 확장된 버전으로 find로 전달됩니다.

답변3

와일드카드는 명령이 아닌 셸에 의해 확장됩니다. find자체 시간에 쉘과 유사한 와일드카드 일치를 수행하는 몇 안 되는 명령 중 하나입니다.

를 실행하면 ls *.xml먼저 셸이 *.xml일치하는 파일 목록(예: )으로 확장된 file1.xml file2.xml file3.xml다음 ls결과 인수 list 와 함께 셸이 호출됩니다 file1.xml file2.xml file3.xml. 그렇기 때문에 파일에 대해 아무것도 모르고 해당 인수가 파일 이름인지 여부에 상관하지 않더라도 echo *.xml동일한 파일 이름 목록이 표시됩니다.echo

실행할 때 find . -name "*.xml":

  1. 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 인용된 단어 find, .의 목록만 있습니다 . 인용 되었으므로 쉘에 관한 한 이는 일반적인 문자입니다.-name*.xml**
  2. 쉘은 find지정된 인수 목록( ., -name, ) 을 사용하여 명령을 실행합니다 *.xml.
  3. find*.xml현재 디렉터리 아래의 모든 디렉터리에서 패턴과 일치하는 이름을 가진 파일을 찾습니다.

실행했는데 find . -name *.xml일치하는 파일이 없는 경우 *.xml:

  1. 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 이것은 인용 되지 않은 단어 , find의 목록일 뿐입니다 ..-name*.xml*
  2. 단어에 *.xml따옴표가 없는 와일드카드가 포함되어 있기 때문에 쉘은 파일 이름 생성을 수행합니다. 일치하는 파일 이름이 없으므로 패턴은 확장되지 않은 상태로 유지됩니다.
  3. 쉘은 find결과 매개변수 목록(예: ., -name, ) 을 사용하여 명령을 실행합니다 *.xml.
  4. find*.xml현재 디렉터리 아래의 모든 디렉터리에서 패턴과 일치하는 이름을 가진 파일을 찾습니다.

실행하면 find . -name *.xml현재 디렉터리에 file1.xml, file2.xml및 다음이 포함됩니다 file3.xml.

  1. 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 이것은 인용 되지 않은 단어 , find의 목록일 뿐입니다 ..-name*.xml*
  2. 단어 *.xml에 따옴표가 없는 와일드카드가 포함되어 있기 때문에 쉘은 파일 이름 생성을 수행합니다. *.xml즉, 일치하는 파일 이름 목록으로 대체됩니다.
  3. 쉘은 find결과 인수 목록(예: ., -name, file1.xml, file2.xml, ) 을 사용하여 명령을 실행합니다 file3.xml.
  4. find도착 시 구문 오류에 대해 불평합니다 file2.xml.

실행하면 find . -name *.xml현재 디렉터리에 일치하는 단일 파일이 포함됩니다 file.xml.

  1. 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 이것은 인용 되지 않은 단어 , find의 목록일 뿐입니다 ..-name*.xml*
  2. 단어 *.xml에 따옴표가 없는 와일드카드가 포함되어 있기 때문에 쉘은 파일 이름 생성을 수행합니다. *.xml즉, 일치하는 파일 이름 목록으로 대체됩니다.
  3. 쉘은 find결과 매개변수 목록(예: ., -name, ) 을 사용하여 명령을 실행합니다 file.xml.
  4. find완벽하게 유효한 명령이 표시되지만 원하는 것은 아닐 수도 있습니다. 일치하는 파일을 찾는 대신 모든 디렉터리에서 호출된 파일을 find찾으라는 메시지가 표시됩니다 .file.xml*.xml

(쉘 평가 및 확장에는 다른 많은 기능이 있습니다. 여기서는 관련된 기능만 언급했습니다.)

(가장 일반적인 쉘(sh, bash, dash, ksh 등)의 기본 동작을 설명합니다. 일부 쉘은 확장되지 않은 와일드카드로 명령을 실행하는 대신 오류를 표시하거나 일치하지 않는 와일드카드를 null로 확장하도록 구성할 수 있습니다. 도움이 됩니다.)

답변4

시도해 보십시오:

find ./ -name *.xml

관련 정보