将多个文件从文件名 X 复制到文件名 Y?

Tia*_*iax 7 cp

我想要做的是复制字典范围内的文件。

文件示例:

-rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
-rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
-rw-r--r--   4 root root    4096 Feb  2  2007 acpi.txt
-rw-r--r--   1 root root      48 Feb  8  2008 adjtime.jpg
-rw-r--r--   4 root root    4096 Feb  2  2007 alchemist.jpg
Run Code Online (Sandbox Code Playgroud)

使用示例:

  • 将 3 个文件复制asps.cfgacpi.txt
  • 将 3 个文件复制a2ps-site.cfgadjtime.jpg
  • 将 4 个文件复制a2ps-site.cfgalchemist.jpg

那么有没有办法将一系列文件(从文件名 X 到文件名 Y)复制到一个目录中?

喜欢: cp filenameX ... filenameY destination/

cam*_*amh 4

通用方法是定义一个打印一系列文件名的 shell 函数。此函数的简单版本将列出当前目录中两个文件名之间的所有文件:

range()
{
    ls | sed -n "/^$1\$/,/^$2\$/p"
}
Run Code Online (Sandbox Code Playgroud)

这使用 sed 范围来打印两个给定字符串 ($1$2) 之间的任何内容。

然后您可以在命令中使用此函数cp(1)

cp $(range asps.cfg acpi.txt) /destination/path
Run Code Online (Sandbox Code Playgroud)

如果文件名中含有空格,此操作将会失败。为此,你需要变得更复杂一些:

range asps.cfg acpi.txt | xargs -d '\n' -I {} cp {} /destination/path
Run Code Online (Sandbox Code Playgroud)

如果您的文件名中包含换行符 (\n),则该操作将会失败。这是不太可能的,所以解决这个问题留给读者作为练习。

您可以将其一起放入另一个 shell 函数中:

cprange()
{
    [ $# -eq 3 ] || { echo "usage: cprange start end dir" >&2; return 1;}
    range "$1" "$2" | xargs -d '\n' -I {} cp {} "$3"
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

cprange filenameX filenameY destination
Run Code Online (Sandbox Code Playgroud)

请记住,范围仅适用于当前目录中的文件名。您可以通过多种方式对此进行扩展(向 附加目录参数range、从参数中提取路径到rangeusingdirname等),但我将根据您的要求将其留给您。请在此询问您是否需要更多详细信息。