Jca*_*o02 3 directory bash lazy-loading find
是find在bash懒惰?
我正在尝试浏览目录树,*.jpg使用以下脚本获取3级目录树中至少有700k文件的所有文件:
for im in $(find $1 -name '*.jpg');
do
echo im;
# Do something with im...
done
Run Code Online (Sandbox Code Playgroud)
但是没有打印任何东西需要很长时间,echo而且我确信脚本可以工作(我使用3级目录树的50k文件测试它,它花费的时间更少,但最后它会打印所有内容).
也许有一个懒惰版本的find或者我可以使用它来让echo脚本运行时显示它们.
$()将立即分配所有find的输出.使用while read循环代替进程替换(推荐使用bash)或管道:
while IFS= read -r im; do
...
done < <(exec find "$1" -name '*.jpg')
Run Code Online (Sandbox Code Playgroud)
exec是我的风格,是可选的.因为我们只在进程替换召唤的子shell中运行一个命令,所以可能没有必要使用另一个fork.
要么
find "$1" -name '*.jpg' | while IFS= read -r im; do
# Unfortunately anything that happens here is already inside
# a subshell so any variable changes would not affect the
# parent shell.
...
done
Run Code Online (Sandbox Code Playgroud)
如果你有不规则的文件名,比如文件名有换行符,请\x00用作分隔符:
while IFS= read -r -d '' im; do
...
done < <(exec find "$1" -name '*.jpg' -print0)
Run Code Online (Sandbox Code Playgroud)
如果循环中的一个命令读取输入,则需要使用另一个文件描述符来阻止这些命令从以下位置读取输入find:
while IFS= read -ru 4 -d '' im; do
...
done 4< <(exec find "$1" -name '*.jpg' -print0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |