【发布时间】:2020-06-15 05:11:26
【问题描述】:
我想做这样的事情:
find ./ -name "*.jpg" -nbresult 50 -exec cp {} /50randomsjpgfrommyharddrive
我可以使用head 和xargs,但是对于-print0,head 不再起作用了。
【问题讨论】:
我想做这样的事情:
find ./ -name "*.jpg" -nbresult 50 -exec cp {} /50randomsjpgfrommyharddrive
我可以使用head 和xargs,但是对于-print0,head 不再起作用了。
【问题讨论】:
如果文件名中没有换行符,-print0 是不必要的,您可以使用:
find ./ -name "*.jpg" | head -n 50 | xargs -d'\n' -n1 -I'{}' cp '{}' /50randomsjpgfrommyharddrive
在此命令中,-d'\n' 将使xargs 分隔换行符。文件名中的其他空格(默认情况下会被xargs 视为分隔符)不会成为问题。
或者,如果您仍需要使用-print0,则以下命令行包含一个类似于head -n 50 的过滤器,但在其输入和输出上基于空分隔符(而不是换行符)。请注意,在这种情况下,xargs 需要 -0。
find ./ -name "*.jpg" -print0 | perl -p0e 'exit if $i++ == 50' | xargs -0 -n1 -I'{}' cp '{}' /50randomsjpgfrommyharddrive
【讨论】:
GNU head 有一个名为 -z 的选项,用于将行终止符更改为 NUL,可用于此任务,如下所示。
find -name '*.jpg' -print0 \
| head -z -n 50 \
| xargs -0 cp -t /destination
【讨论】:
head -z 是什么时候引入的?不在 coreutils 8.21 (Ubuntu 14.04LTS) 虽然我看到 8.28 有它。