Bash循环遍历目录中的文件

时间:2012-07-27 05:08:28

标签: bash loops

我有一个由其他人创建的bash脚本,我需要稍微修改一下。 由于我是Bash的新手,我可能需要一些常用命令的帮助。

脚本只是循环遍历一个特定文件扩展名的目录(递归)。 这是当前的脚本:(runme.sh)

#! /bin/bash
SRC=/docs/companies/

function report()
{
    echo "-----------------------"
    find $SRC -iname "*.aws" -type f -print
    echo -e "\033[1mSOURCE FILES=\033[0m" `find $SRC -iname "*.aws" -type f -print |wc -l`
    echo "-----------------------"
exit 0
}

report

我只需输入#。/ runme.sh 即可查看扩展名为.aws的所有文件的列表

我的主要目标是限制搜索。 (有些目录文件太多了) 我想运行脚本,将其限制为只有20个文件。

我是否需要将整个脚本放入循环方法中?

3 个答案:

答案 0 :(得分:1)

这很简单 - 只要你想要前20个文件,只需通过find管道第一个head -n 20命令。但是当我在它的时候,我无法抗拒一点清理:正如所写的,它运行find两次,一次打印文件名,一次计算它们;如果要搜索大量文件,这是浪费时间。其次,在函数(report)中包装脚本的实际内容没有多大意义,并且使用函数exit(而不是return ing)会更少。最后,我喜欢使用双引号保护文件名并讨厌反引号(改为使用$())。所以我冒昧地进行了一些清理:

#! /bin/bash
SRC=/docs/companies/

files="$(find "$SRC" -iname "*.aws" -type f -print)"
if [ -n "$files" ]; then
    count="$(echo "$files" | wc -l)"
else # echo would print one line even if there are no files, so special-case the empty list
    count=0
fi

echo "-----------------------"
echo "$files" | head -n 20
echo -e "\033[1mSOURCE FILES=\033[0m $count"
echo "-----------------------"

答案 1 :(得分:0)

使用head -n 20(由Peter提出)。补充说明:脚本效率非常低,因为它运行find两次。当命令第一次运行时,您应该考虑使用tee生成临时文件,然后计算此文件的行并删除该文件。

答案 2 :(得分:0)

我个人更喜欢这样做:

files=0
while read file ; do
    files=$(($files + 1))
    echo $file
done < <(find "$SRC" -iname "*.aws" -type f -print0 | head -20)

echo "-----------------------"
find $SRC -iname "*.aws" -type f -print
echo -e "\033[1mSOURCE FILES=\033[0m" $files
echo "-----------------------"

如果您只想要数,那么您只能使用find "$SRC" -iname "*.aws" -type f -print0 | head -20