查找不想在某个级别查找 *.sh

查找不想在某个级别查找 *.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是一个由 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 扩展通配符,请引用通配符。

相关内容