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

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

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

ls *tgz|head -100|xargs -i mv "{}" ../

但我知道如果文件名包含换行符,结果可能会不可预测。因此,更正确的做法是:

find ... -print0 | xargs -0

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

 find . -name '*tgz' -print0|head -2|less

文件1.tgz^@文件2.tgz^@文件3.tgz^@文件4.tgz^@文件5.tgz^@

有没有什么方法可以消除这种尴尬呢?

我尝试借助 awk 来解决它:

find . -name 'BATCHED*' -print0|awk 'BEGIN{RS=""}'

但它仍然显示全部或零行。

可以用 awk 解决吗?还有更好的解决方案吗?

顺便说一句,我发现非常有启发性的参考,但没有回答我的问题。

答案1

另一个机会安全的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 )

为了验证,只需将其输入到以下管道中:

while IFS= read -r -d ''
do
    echo "START${REPLY}END"
done

答案2

问题在于xargs它是面向单词的,而像head和 这样的命令tail是面向行的。一个解决方案可能是不使用xargs而是GNU并行

答案3

我相信您正在寻找 xargs 的 --max-args 或 --max-lines 参数,具体取决于您的输入格式:

# Run less on no more than two files at a time
find . -type f -print0 | xargs --null --max-args=2 less

相关内容