如何限制与选项 -print0 一起使用的 find 命令的输出

sza*_*asz 5 bash awk find

我想限制 find 命令的输出。过去我曾经用于这个 ls 命令,例如:

ls *tgz|head -100|xargs -i mv "{}" ../
Run Code Online (Sandbox Code Playgroud)

但我知道如果文件名包含换行符,结果可能是不可预测的。所以更正确的方法是这样的:

find ... -print0 | xargs -0
Run Code Online (Sandbox Code Playgroud)

但是采用这种方法我无法使用 head 命令限制 find 的输出 - 它显示所有文件名用 ^@ 特殊符号分隔:

 find . -name '*tgz' -print0|head -2|less
Run Code Online (Sandbox Code Playgroud)

file1.tgz^@file2.tgz^@file3.tgz^@file4.tgz^@file5.tgz^@

有没有办法消除这种尴尬?

我试图在 awk 的帮助下解决它:

find . -name 'BATCHED*' -print0|awk 'BEGIN{RS=""}'
Run Code Online (Sandbox Code Playgroud)

但它仍然显示所有或零行。

可以借助awk解决吗?有更好的解决方案吗?

顺便提一句。我发现这个非常有指导意义的参考,但我的问题没有答案。

l0b*_*0b0 3

安全find的另一个机会:

while IFS= read -r -d '' -u 9
do
    let ++count
    if [[ count -gt 10 ]]
    then
        unset count
        break
    fi
    printf "$REPLY"
    printf "$\x00"
done 9< <( find /full/path -print0 )
Run Code Online (Sandbox Code Playgroud)

要验证,只需将其输入:

while IFS= read -r -d ''
do
    echo "START${REPLY}END"
done
Run Code Online (Sandbox Code Playgroud)