与 3 名高管一起寻找

Find with 3 execs

我写了这个命令:

find -exec test -e "{}/meta" ";" -exec du -h -t 500M {} ";"

它检查文件 meta 是否在适当位置,以及它的整个位置是否大于 500MB。现在我想阅读这个 meta 文件的第一行。我试过这个

find -exec test -e "{}/meta" ";" -exec test du -h -t 500M {} ";" -exec sed '1q;d' {}/meta ";"

或这个

find -exec test -e "{}/meta" ";" -exec du -h -t 500M {} ";" -exec head -n 1 {}/meta ";"

但它会忽略 du 并从每个 meta 文件中读取行。
它应该是什么样子?

我实际上会在 bash 中使用 while 循环,就像那样:

find -type d | \
    while IFS= read -r dir; do
        if (($(du -ms -- "$dir" | cut -f1) >= 500)); then
            [[ -e "$dir/meta" ]] && head -n1 "$dir/meta"
        fi
    done

我也没有依赖du-t标志,因为它只影响输出,不影响`du的状态码,所以我只是在[=中使用简单的算术比较18=] 代替。

尝试 find . -type d -size +500M 后,应用到目录的 -size 选项似乎没有检查其总文件大小。

搜索所需文件并检查其目录大小应该是更好的方法:

find . -type f -name 'meta' -execdir bash -c 's=$(du -sh .); [[ "${s%M*}" -gt "500" ]] && sed "1q" meta' \;

另一种方法是使用 -execdir:

find -name meta -type f -execdir bash -c 's=($(du -s .)) ; (( s > 2000 ))'  \; -exec head -n1 {} \;