질문이 있습니다 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
이 없습니다.
해결책은 연결된 질문과 동일합니다. 쉘이 확장하는 것을 원하지 않으면 와일드카드를 인용하십시오.