Bash 脚本 - 迭代 find 的输出
- 2024-11-11 08:27:00
- admin 原创
- 23
问题描述:
我有一个 bash 脚本,需要在其中迭代 find 命令输出的每一行,但看起来我正在迭代 find 命令中的每个单词(空格分隔)。到目前为止,我的脚本如下所示:
folders=`find -maxdepth 1 -type d`
for $i in $folders
do
echo $i
done
我希望这会给出如下输出:
./dir1 and foo
./dir2 and bar
./dir3 and baz
但我得到的输出如下:
./dir1
and
foo
./dir2
and
bar
./dir3
and
baz
我在这里做错了什么?
解决方案 1:
folders=`foo`
总是错误的,因为它假定你的目录不包含空格、换行符(是的,它们是有效的!)、通配符等。一种强大的方法(需要 GNU 扩展-print0
)如下:
while IFS='' read -r -d '' filename; do
: # something with "$filename"
done < <(find . -maxdepth 1 -type d -print0)
另一种安全且可靠的方法是让它find
直接调用您想要的命令:
find . -maxdepth 1 -type d -exec printf '%s
' '{}' +
请参阅UsingFind维基页面来了解该主题的完整论述。
解决方案 2:
由于您没有使用任何更高级的功能find
,因此您可以使用一个简单的模式来迭代子目录:
for i in ./*/; do
echo "$i"
done
解决方案 3:
你可以做这样的事情:
find -maxdepth 1 -type d | while read -r i
do
echo "$i"
done
解决方案 4:
根据 Charles Duffy 的回答(赞!),我创建了一个 bash 函数qfind
(引用 find),它输出除引用之外的所有输出find
。我将其添加到我的.bashrc
qfind() {
while IFS='' read -r -d $' ' findOutput; do
/usr/bin/echo -n "${findOutput@Q} "
done < <(/usr/bin/find "$@" -print0)
}
引号内的字符串以空格分隔。${findOutput@Q}
扩展为 的引号内的值,${findOutput}
类似"$(quote "$findOutput")"
。 当-n
从 中删除时echo
,它也会使用换行符进行分隔。
可以这样使用
eval "folders=($(qfind . -maxdepth 1 -type d))"
for i in "${folders[@]}"; do
echo "$i"
done
eval
需要评估任何引用的子字符串。
使用预定义函数,循环体中就不会有任何额外的命令在循环期间从 stdin 读取字符。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD