2013-03-09 65 views
1

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

*.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 

如果我复制manualy “找到test_scripting型的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 

为什么没有“查找”命令过程中正确的变量?

回答

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 

有关删除隐藏字符的更多信息,请参阅此thread

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

相关问题