在bash中复制选定的文件

时间:2015-02-05 11:16:53

标签: bash copy selected xargs cp

我正在尝试在目录之间复制特定文件。因此,我列出了ls的所有文件,添加了一个包含cat -n的行号,然后选择了我要用head -100复制的前100个文件。之后我使用xargs命令,但它不起作用。这是代码:

ls * | cat -n | head -100 | xargs -0 cp -t ~/foo/bar

该命令在屏幕上重现文件列表并返回警告File name too long

我也尝试使用-exec cp -t,并返回消息-bash: -exec: command not found

编辑: 我的文件名包含多年(例如1989a,1989b,1991a,1992c),因此我想选择在某一年之前发布的所有文件(例如1993年)。

3 个答案:

答案 0 :(得分:3)

这将导致100次cp的调用,但您可以使用循环:

count=0; for i in *; do cp "$i" ~/foo/bar; ((++count == 100)) && break; done

另一种方法是使用数组:

files=( * )
cp "${files[@]:0:100}" ~/foo/bar

glob *扩展为使用当前目录中的文件列表填充数组。然后复制数组的前100个元素。

答案 1 :(得分:2)

如果您没有太多文件(以便不超过参数的最大数量和允许参数的最大缓冲区长度),您可以使用以下内容:

shopt -s nullglob
cp -t ~/foo/bar {1970..1993}*

复制名称以1970年至1993年(含)之间的数字开头的所有文件。请注意,这也将复制名为197444的文件(如果有的话),并且还会尝试复制具有匹配名称的目录(除非您发出警告,否则它会忽略它也传递-r标志。)

请参阅:

答案 2 :(得分:1)

使用GNU Parallel它将如下所示:

ls | head -100 | parallel -X cp {} ~/foo/bar