$ uname -a
Linux xxxx 2.6.32-696.1.1.el6.x86_64 #1 SMP Tue Mar 21 12:19:18 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux
$ mkdir test
$ cd test
$ mkdir logs
$ touch logs/log.2017-08-01
$ touch log.2017-08-04
$ ls -lAR
.:
total 4
-rw-rw---- 1 icestation_uat athapps 0 Aug 4 21:00 log.2017-08-04
drwxrwx--- 2 icestation_uat athapps 4096 Aug 4 21:00 logs
./logs:
total 0
-rw-rw---- 1 icestation_uat athapps 0 Aug 4 21:00 log.2017-08-01
$ find ./logs/ -name log.2017-08-??
$ find -D search ./logs/ -name log.2017-08-??
consider_visiting: fts_info=FTS_D , fts_level= 0, prev_depth=-2147483648 fts_path=`./logs/', fts_accpath=`./logs/'
consider_visiting: fts_info=FTS_NSOK, fts_level= 1, prev_depth=0 fts_path=`./logs/log.2017-08-01', fts_accpath=`log.2017-08-01'
consider_visiting: fts_info=FTS_DP, fts_level= 0, prev_depth=1 fts_path=`./logs/', fts_accpath=`./logs/'
$ find -D search ./logs/ -name log.2017-08-01
consider_visiting: fts_info=FTS_D , fts_level= 0, prev_depth=-2147483648 fts_path=`./logs/', fts_accpath=`./logs/'
consider_visiting: fts_info=FTS_NSOK, fts_level= 1, prev_depth=0 fts_path=`./logs/log.2017-08-01', fts_accpath=`log.2017-08-01'
./logs/log.2017-08-01
consider_visiting: fts_info=FTS_DP, fts_level= 0, prev_depth=1 fts_path=`./logs/', fts_accpath=`./logs/'
$ rm log.2017-08-04
$ find ./logs/ -name log.2017-08-??
./logs/log.2017-08-01
真的不明白,为什么find在第一次调用时没有返回任何内容,并且在删除一个文件后按预期工作。
请注意,如果您尝试重现,那么两件事情很重要
答案 0 :(得分:1)
问题是缺少引号。以下找不到任何内容:
$ find ./logs/ -name log.2017-08-??
但是,以下内容找到了您想要的文件:
$ find ./logs/ -name 'log.2017-08-??'
./logs/log.2017-08-01
在将命令的参数传递给find之前,shell执行路径名扩展。观察:
$ echo find ./logs/ -name log.2017-08-??
find ./logs/ -name log.2017-08-04
shell在表达式log.2017-08-??
中看到通配符,并查找与 glob 匹配的文件。 shell找到log.2017-08-04
并在中将参数传递给find
之前替换。由于/logs
目录中没有与log.2017-08-04
匹配的文件,find
将不返回任何内容。
shell仅对未加引号的表达式执行路径名扩展。这就是引用表达式时此问题消失的原因。