【问题标题】:bash `find` escapingbash `find` 转义
【发布时间】:2012-06-20 20:15:06
【问题描述】:

我需要递归查找目录中的所有 TIFF,但忽略一些也恰好以“.tif”结尾的工件(基本上所有隐藏文件)。这个命令:

find . -type f -name '*.tif' ! -name '.*'

在命令行上完全按照我想要的方式工作,但是在 bash 脚本中它什么也找不到。我尝试用-and -not 替换! 并且--我认为--几乎所有我能想到和/或googleshpere 推荐的转义排列,例如.\*,省略单引号等。显然我遗漏了一些东西,感谢任何帮助。

编辑:这是脚本的重要部分;它正在查找的目录是参数化的,但我一直在用硬编码进行调试;没有区别:

#!/bin/bash
RECURSIVE=1
DIR=$1

#get the absolute path to $DIR
DIR=$(cd $DIR; pwd)

FIND_CMD="find $DIR -type f -name '*.tif' ! -name '.*'"
if [ $RECURSIVE == 1 ]; then
    FIND_CMD="$FIND_CMD -maxdepth 1"
fi

for in_img in $($FIND_CMD | sort); do
    echo $in_img # for debugging
    #stuff
done

【问题讨论】:

  • 请摘录您的脚本
  • 您是从包含.tiff 文件的目录调用脚本吗?
  • 脚本的工作目录是什么?这就是find 命令寻找匹配“*.tif”的文件的地方。
  • 这两个版本似乎都适合我。
  • 如果您删除. 之后的所有内容会怎样?它仍然没有找到任何东西吗?

标签: bash escaping find


【解决方案1】:

要查找隐藏文件,您可以使用以下方法:

 find . \( ! -regex '.*/\..*' \) -type f -name "*.tif"

它检查文件名并且不显示(括号中的!)以点开头的文件,即隐藏文件。

【讨论】:

  • 同样的问题,但感谢您的替代方案。我认为这与我正在构建表达式并将其存储在变量中这一事实有关。
【解决方案2】:

这与将表达式存储在变量中有关。解决方案是使用eval,无论如何这当然是正确的做法。除了 for 循环的开头之外,一切都与上面相同:

for in_img in $(eval $FIND_CMD | sort); do
    #stuff
done

【讨论】:

  • 我强烈建议不要以这种方式使用eval,因为它可能会导致一些truly bizarre bugs。您最好将命令存储在该链接中描述的数组中(或根本不存储它)。另请参阅BashFAQ #050
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 2022-08-04
  • 2014-08-11
  • 2017-06-10
  • 2017-11-11
  • 2013-12-07
  • 2012-08-13
相关资源
最近更新 更多