0

我有一个由其他人创建的 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 个文件。

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

4

3 回答 3

1

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

#! /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 "-----------------------"
于 2012-07-27T05:27:07.017 回答
0

使用head -n 20(按照彼得的建议)。附加说明:该脚本效率非常低,因为它运行find了两次。您应该考虑tee在命令第一次运行时使用 生成一个临时文件,然后计算该文件的行数并删除该文件。

于 2012-07-27T05:31:29.253 回答
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

于 2012-07-27T10:11:29.843 回答