我想限制 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