如果匹配文件存在于上层,则查找命令无法在子文件夹中找到文件

时间:2017-08-04 20:18:25

标签: unix find

$ 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在第一次调用时没有返回任何内容,并且在删除一个文件后按预期工作。

请注意,如果您尝试重现,那么两件事情很重要

  1. 顶级文件的名称应该是今天的日期(即我在2017年8月4日进行测试)
  2. 传递给find命令的掩码应该匹配:顶级文件和嵌套文件

1 个答案:

答案 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仅对未加引号的表达式执行路径名扩展。这就是引用表达式时此问题消失的原因。