我有一个问题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
是一个由 shell 扩展的 glob 表达式,结果作为参数传递给正在调用的程序。当且仅当没有匹配文件时,glob 表达式才会按原样传递。如果您希望将通配符传递给您正在运行的程序,您应该养成引用通配符的习惯。
例如,如果您要从 运行find . -path *.sh
,/path/do_not_upload/updates/1.1.1/run_pre_update/
则实际执行的命令将是find . -path 001.sh 002.sh
,这几乎肯定不是您想要的。
请注意,这与 MS-DOS 和相关系统不同,在 MS-DOS 和相关系统中,全局扩展是由被调用的程序完成(或不完成)的。
为了防止 shell 扩展,请将参数括在双引号甚至单引号中 - 这会将其逐字传递给调用的程序,从而让其find
进行自己的扩展:
$ find . -path '*.sh'
答案2
这主要是重复的这个问题,但是没有输出的原因有点不同。
对于-path
,参数必须匹配整个路径(包括命令行参数)。当foo.sh
当前目录中存在时,您正在执行
find . -path foo.sh
因为foo.sh
不匹配./foo.sh
,所以没有输出。
解决方案与链接的问题相同:如果您不希望 shell 扩展通配符,请引用通配符。