使用Bash脚本获取具有所需扩展名的所有文件

时间:2016-04-15 13:32:42

标签: linux bash sh

我正在尝试编写一个bash脚本,如果我传递包含某个扩展名的文本文件,并且文件夹返回一个输出文件,其中包含与所需扩展名匹配的所有文件的列表,在所有子目录中递归搜索< / p>

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

我试过了:

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

但不起作用

2 个答案:

答案 0 :(得分: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  

使用名为y的文本文件,其中包含以下内容

txt
sh

并致电:

./x.sh y .

会生成一个文件result.txt,其内容为:

a.txt
b.txt
x.sh

好的,让我们从评论中提供一些额外的提示: 如果结果领域不应该从脚本的其他结果中收集任何其他结果,则可以简化为:

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

如前所述: 可以删除硬编码的result.txt,并且调用可以类似于

./x.sh y . > result.txt

答案 1 :(得分:0)

试试这个单线命令。

/ mydir 替换为要搜索的文件夹。

将作为参数传递的扩展名列表更改为 egrep 命令:

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

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

必须使用.

转义

[.]字符