Find는 특정 수준에서 *.sh를 찾고 싶지 않습니다.

Find는 특정 수준에서 *.sh를 찾고 싶지 않습니다.

질문이 있습니다 find. 특정 디렉토리 수준에 있으면 *.sh 파일을 찾을 수 없습니다. 그러나 *.sql 파일은 찾습니다.

/path$ cd do_not_upload/updates/1.1.1/
/path/do_not_upload/updates/1.1.1$ find . -path *.sh
./run_pre_update/002.sh
./run_pre_update/001.sh
./run_post_update/001.sh
/path/do_not_upload/updates/1.1.1$ find . -path *.sh
./run_pre_update/002.sh
./run_pre_update/001.sh
./run_post_update/001.sh
/path/do_not_upload/updates/1.1.1$ cd ..
/path/do_not_upload/updates$ find . -path *.sh
./1.1.3/run_pre_update/002.sh
./1.1.3/run_pre_update/001.sh
./1.1.3/run_post_update/001.sh
./1.1.1/run_pre_update/002.sh
./1.1.1/run_pre_update/001.sh
./1.1.1/run_post_update/001.sh
/path/do_not_upload/updates$ cd ..
/path/do_not_upload$ find . -path *.sh
./updates/1.1.3/run_pre_update/002.sh
./updates/1.1.3/run_pre_update/001.sh
./updates/1.1.3/run_post_update/001.sh
./updates/1.1.1/run_pre_update/002.sh
./updates/1.1.1/run_pre_update/001.sh
./updates/1.1.1/run_post_update/001.sh
/path/do_not_upload$ cd ..
/path$ find . -path *.sh
/path$ find . -path *.sql
./do_not_upload/updates/1.1.3/sql_migrations/002.sql
./do_not_upload/updates/1.1.3/sql_migrations/001.sql
./do_not_upload/updates/1.1.1/sql_migrations/002.sql
./do_not_upload/updates/1.1.1/sql_migrations/001.sql

$ find --version
find (GNU findutils) 4.4.2

/path$ stat do_not_upload/
  File: ‘do_not_upload/’
  Size: 60          Blocks: 0          IO Block: 4096   directory
Device: 14h/20d Inode: 159862      Links: 3
Access: (0775/drwxrwxr-x)  Uid: ( 1000/  jorgee)   Gid: ( 1000/  jorgee)
Access: 2014-09-10 14:02:34.449376973 -0300
Modify: 2014-09-10 13:54:13.805363567 -0300
Change: 2014-09-10 13:54:13.805363567 -0300
 Birth: -

답변1

Unix 계열 시스템에서 *.sh셸에 의해 확장된 glob 표현식으로, 결과가 호출 프로그램에 인수로 전달됩니다. 일치하는 파일이 없는 경우에만 glob 표현식이 변경되지 않고 전달됩니다. 실행 중인 프로그램에 와일드카드 문자를 전달하려면 와일드카드 문자를 인용하는 습관을 들여야 합니다.

find . -path *.sh예를 들어, 에서 실행한다면 /path/do_not_upload/updates/1.1.1/run_pre_update/실제 실행되는 명령은 가 될 것입니다 find . -path 001.sh 002.sh. 이는 여러분이 원하는 것이 거의 확실하지 않습니다.

이는 호출된 프로그램에 의해 전역 확장이 수행되거나 수행되지 않는 MS-DOS 및 관련 시스템과 다르다는 점에 유의하십시오.

쉘 확장을 방지하려면 인수를 큰따옴표나 작은따옴표로 묶으십시오. 이렇게 하면 인수가 호출 프로그램에 그대로 전달되어 find자체 확장이 가능해집니다.

$ find . -path '*.sh'

답변2

대부분 중복이네요이 문제, 하지만 출력이 되지 않는 이유는 조금 다릅니다.

의 경우 -path인수는 전체 경로(명령줄 인수 포함)와 일치해야 합니다. foo.sh현재 디렉토리에 존재 하면 실행 중입니다.

find . -path foo.sh

foo.sh일치하는 항목이 없으므로 출력 ./foo.sh이 없습니다.

해결책은 연결된 질문과 동일합니다. 쉘이 확장하는 것을 원하지 않으면 와일드카드를 인용하십시오.

관련 정보