bash`find`逃跑

bash`find`逃跑,bash,escaping,find,Bash,Escaping,Find,我需要递归地在一个目录中查找所有TIFF,但忽略一些也恰好以“.tif”结尾的工件(基本上都是隐藏文件)。此命令: find . -type f -name '*.tif' ! -name '.*' 它在命令行上的工作方式正是我所希望的,但是在bash脚本中它什么也找不到。我试过替换与-和-not以及--我想--几乎每一个我能想到的和/或谷歌网站推荐的转义排列,例如\*,省略单引号,等等。显然我遗漏了一些东西,任何帮助都是非常感谢的 编辑:这里是脚本的重要部分;它正在查找的目录是参数化的,但我

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

find . -type f -name '*.tif' ! -name '.*'
它在命令行上的工作方式正是我所希望的,但是在bash脚本中它什么也找不到。我试过替换
-和-not
以及--我想--几乎每一个我能想到的和/或谷歌网站推荐的转义排列,例如
\*
,省略单引号,等等。显然我遗漏了一些东西,任何帮助都是非常感谢的

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

#!/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

要不查找隐藏文件,可以使用以下命令:

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

它检查文件名,不显示(!在括号中)以点开头的文件,这些文件是隐藏文件。

它与将表达式存储在变量中有关。解决方案是使用
eval
,这当然是正确的做法。除了for循环的开始处,所有内容都与上面相同:

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

请包含脚本的摘录。是否从包含
.tiff
文件的目录调用脚本?脚本的工作目录是什么?这就是
find
命令查找与“*.tif”匹配的文件的地方。这两个版本似乎都适用于我。如果在
之后删除所有内容,会发生什么情况?它仍然没有找到任何东西吗?同样的问题,尽管感谢您的选择。我认为这与我正在构建表达式并将其存储在变量中这一事实有关。我强烈建议不要以这种方式使用
eval
,因为它可能会导致一些错误。最好按照该链接中的描述将命令存储在数组中(或者根本不存储它)。另外,请参见。