【问题标题】:using shell variable in find regex在查找正则表达式中使用 shell 变量
【发布时间】:2020-05-20 07:14:10
【问题描述】:

我想删除超过 1 天的具有某种模式的文件(例如以“测试”开头),我有:

mydir=/find/my/path

find $mydir -type f -mtime -1\
-regextype egrep -regex '$mydir\/test.*'\
-delete 

但它并没有为我删除文件,我试过了

mydir=/find/my/path

    find $mydir -type f -mtime -1\
    -regextype egrep -regex '.*\/test.*'\
    -delete 

这个有效。为什么第一个不起作用?根据 'find' using regex with variables 我可以在查找正则表达式中使用变量,有什么问题?

【问题讨论】:

  • shell中的单引号和双引号有什么区别?
  • 你也不需要正则表达式,顺便说一句。只需一个普通的文件 glob 即可:find "$mydir" -type -f -mtime -1 -name "test*" -delete
  • @code3:除了 gaganshera 的(正确)答案之外:你为什么在这样一个简单的情况下使用正则表达式? find $mydir -type f -mtime -1 -name 'test*' -delete 也可以。
  • @Shawn 和@user1934428 有细微的差别。您的命令会删除 mydir/dir/test 但不会删除 mydir/testdir/file-regex "$mydir/test.*" 会删除 mydir/testdir/file 但不会删除 mydir/dir/test

标签: regex linux bash shell find


【解决方案1】:

这是因为在第一个中,您尝试在带有 '$mydir\/test.*' 的单个引号内评估变量 $mydir。这不会评估$mydir 的值,而是按字面意思理解为$mydir

在此处使用双引号,然后使用

重试
mydir=/find/my/path

find $mydir -type f -mtime -1\
-regextype egrep -regex "$mydir\/test.*"\
-delete 

【讨论】:

    【解决方案2】:

    Gaganshera's answer 已经解释了脚本中的问题并展示了如何解决这些问题。这是结合 find 和 glob 的不同但等效的解决方案:

    mydir=/find/my/path
    find "$mydir"/test* -type f -mtime -1 -delete 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多