我有一个由其他人创建的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个文件。
我是否需要将整个脚本放入循环方法中?
答案 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