![将前 n 个文件复制到不同的目录中](https://linux22.com/image/20403/%E5%B0%86%E5%89%8D%20n%20%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD.png)
答案1
以下将当前目录中找到的前 1000 个文件复制到$destdir
.尽管实际文件取决于find
.
$ find . -maxdepth 1 -type f |head -1000|xargs cp -t "$destdir"
cp
您将需要for的 GNU 实现-t
,即与 GNU 兼容的find
for -maxdepth
。另请注意,它假设文件路径不包含空格、换行符、引号或反斜杠(或无效字符或在某些xargs
实现中长度超过 255 个字节)。
编辑:要处理带有空格、换行符、引号等的文件名,您可能需要使用以 null 结尾的行(假设该版本head
具有该-z
选项):
find . -maxdepth 1 -type f -print0 | head -z -n 1000 | xargs -0 -r -- cp -t "$destdir" --
答案2
纯 shell 解决方案(调用cp
多次)。
N=1000;
for i in "${srcdir}"/*; do
[ "$((N--))" = 0 ] && break
cp -t "${dstdir}" -- "$i"
done
这会将最大数量的$N
文件从$srcdir
复制到$dstdir
。以点开头的文件将被省略。 (据我所知,无法保证所选文件集是确定性的。)
答案3
下面是可怕的一行:
perl -MFile::Copy -e 'opendir(DIR,$ARGV[0]);$n=1000; (-f $_) && copy($_,"$ARGV[1]/$_") while($n-- && readdir(DIR))
适用于包含空格、引号等的文件,这些文件往往会破坏基于 shell 的解决方案(缺少 $IFS 扭曲)。当然,如果你的文件名正常,shell 就没有问题。
编辑:添加了仅复制文件的检查。