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

Unix 如果上层存在匹配的文件,则“查找”命令无法在子文件夹中找到文件,unix,find,Unix,Find,真的不明白,为什么find在第一次调用时不返回任何内容,并且在删除一个文件后按预期工作 注意,如果你想复制,那么有两件事很重要 顶级文件的名称中应包含今日日期(即,我将于2017年8月4日进行测试) 传递给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

真的不明白,为什么find在第一次调用时不返回任何内容,并且在删除一个文件后按预期工作

注意,如果你想复制,那么有两件事很重要

  • 顶级文件的名称中应包含今日日期(即,我将于2017年8月4日进行测试)
  • 传递给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 ./logs/ -name log.2017-08-??
    
    解释 shell在将命令的参数传递给find之前进行路径名扩展。注意:

    $ find ./logs/ -name 'log.2017-08-??'
    ./logs/log.2017-08-01
    
    shell在表达式
    log.2017-08-??
    中看到通配符,并查找与该glob匹配的文件。shell在参数传递到
    find
    之前查找
    log.2017-08-04
    ,并替换中的。由于
    /logs
    目录中没有与
    log.2017-08-04
    匹配的文件,
    find
    将不返回任何内容


    shell仅对未加引号的表达式进行路径名扩展。这就是为什么在引用表达式时此问题消失的原因。

    有没有办法禁用给定脚本的扩展?@AlexanderPavlov您可以使用
    GLOBIGNORE='*'
    来实现这一点。不过,从长远来看,学会在需要的地方使用引号会更好。
    $ echo find ./logs/ -name log.2017-08-??
    find ./logs/ -name log.2017-08-04