使用find查看非常大的目录树

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脚本运行时显示它们.

kon*_*box 7

$()将立即分配所有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)