复制 bash 中的选定文件

Copy selected files in bash

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

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

该命令在屏幕上重现文件列表和 returns 警告 File name too long

我也尝试过 -exec cp -t 及其 returns 消息 -bash: -exec: command not found

编辑: 我的文件名包含年份(例如 1989a、1989b、1991a、1992c),所以我想 select 所有在特定年份(例如 1993)之前发布的文件。

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

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

另一种方法是使用数组:

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

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

如果你没有太多文件(以免超过你机器上允许的参数的最大参数数量和参数的最大缓冲区长度),你可以使用类似的东西:

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

复制名称以 1970 年到 1993 年(含)之间的数字开头的所有文件。请注意,这还将复制一个名为 197444 的文件(如果有),并且还将尝试复制具有匹配名称的目录(除非您通过 -r 标志也)。

参见:

使用 GNU Parallel 它将如下所示:

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