1

我想在目录结构中递归搜索特定文件类型的文件。但我需要从外部文件传递文件类型。输出应该是列表,其中每一行都是文件的绝对路径。我将使用输出进行进一步处理。文件类型列表所在的外部文件看起来像这样(filter.lst):

*.properties

我试过这个(searchfiles.sh):

while read line
do
 echo "$(find $1 -type f -name $line)"
done < $2

脚本中的 echo 命令仅用于测试目的。我运行了脚本:

./searchfiles.sh test_scripting filter.lst

find 命令的 echo 输出为空。为什么?我尝试通过以下方式更改脚本以测试命令是否正确构建并且文件 *.properties 是否存在:

while read line
do
 echo "find $1 -type f -name $line"
 echo "$(find $1 -type f -name $line)"
done < $2

我有输出:

./searchfiles.sh test_scripting filter.lst
find test_scripting -type f -name *.properties

如果我手动复制“find test_scripting -type f -name *.properties”并将其粘贴到shell,则正确找到文件:

find test_scripting -type f -name *.properties
test_scripting/dir1/audit.properties
test_scripting/audit.properties
test_scripting/dir2/audit.properties

为什么“查找”命令不能正确处理变量?

4

1 回答 1

0

奇怪行为的原因是输入 filter.lst 文件中的隐藏字符。filter.lst 在 Windows 操作系统中创建,然后复制到 Linux 操作系统。因此 find 命令没有找到预期的文件。测试输入文件是否包含隐藏字符:

od -c filter.lst
0000000   *   .   p   r   o   p   e   r   t   i   e   s  \r  \n
0000016

隐藏字符是“\r”。编辑脚本以在每行中使用 sed 命令删除隐藏字符。

while read line
do
 echo "$(find $1 -type f -name $(echo $line | sed -e 's/\r$//'))"
done < $2

有关删除隐藏字符的更多信息在此线程中。

注意:最好的方法是在空目录中运行脚本。如果在您运行脚本的目录中有名为 example.properties 的文件,“echo $line”(作为 echo *.properties 执行)将仅显示 .properties 文件列表 - 在这种情况下仅显示文件示例.属性。

于 2013-03-10T13:29:55.003 回答