2016-04-15 92 views
0

我想写一个bash脚本,如果我通过一个包含一些扩展名和文件夹的文本文件返回一个输出文件与所需的扩展名匹配的所有文件列表在所有子目录递归搜索Bash脚本获取所需的扩展名的所有文件

的文件夹是我的第二个参数的扩展名列表文件,我的第一个参数

我曾尝试:

for i in $1 ; do 
    find . -name $2\*.$i -print>>result.txt 
done 

但不工作

+0

“该文件夹是我的第一个参数扩展名列表文件我的第二个参数” - 脚本似乎使用args反过来。 –

+0

有这么多的错误...离开'[]',在'do'之后离开':',并且总是在两个事物之间放置空格,否则bash会搜索['或'do: ',或者给你'某物]'作为一个变量值。 – Siguza

+0

你是对的我已更正 – AndreaF

回答

1

被转义为从注释中提到:

它不是写一个硬编码的文件名是个好主意。 给出的示例仅修复OP问题中的给定代码。 是的,当然,它甚至更好

x.sh y . > blabla 

打电话,从脚本本身删除的文件名。但我的目的不是解决问题...

以下bash脚本,命名为x.sh

#!/bin/bash 
echo -n >result.txt        # delete old content 
while read i; do        # read a line from file 
     find $2 -name \*.$i -print>>result.txt # for every item do a find 
done <$1          # read from file named with first arg from cmdline 

与以下内容

txt 
sh 

命名为y,并呼吁与文本文件:

./x.sh y . 

产生文件result.txt项其内容是:

a.txt 
b.txt 
x.sh 

OK,让我们给一些额外的提示从评论了: 如果结果FIEL不应该收集脚本的其他结果的任何其他conntent它可以简化为:

#!/bin/bash 
while read i; do     # read a line from file 
     find $2 -name \*.$i -print # for every item do a find 
done <$1 >result.txt    # read from file named with first arg from cmdline 

如前所述: 硬编码结果。txt可以被删除和呼叫可以像

./x.sh y . > result.txt 
./x.sh y . > result.txt 
+0

写入一个静态命名的文件是一个巨大的,充满痛苦的反模式。 Unix工具写入标准输出是有原因的;只要按照他们的领导。 – tripleee

+0

够公平的。 'echo -n'仍然是完全多余的;只是重定向'done'来覆盖任何以前的文件。也许可以解释,这不是你推荐的。 – tripleee

+0

@tripleee取决于你在做什么。 – 123

0

试一试这个一行命令。

用要搜索的文件夹替换/mydir

变化作为参数传递给egrep的命令扩展的列表:

find /mydir -type f | egrep "[.]txt|[.]xml" >> result.txt 

egrep的后,每个扩展名应该与|分开。

.字符必须[.]

相关问题