我想要做的是复制字典范围内的文件。
文件示例:
-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)
使用示例:
asps.cfg
到acpi.txt
a2ps-site.cfg
到adjtime.jpg
a2ps-site.cfg
到alchemist.jpg
那么有没有办法将一系列文件(从文件名 X 到文件名 Y)复制到一个目录中?
喜欢: cp filenameX ... filenameY destination/
通用方法是定义一个打印一系列文件名的 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
、从参数中提取路径到range
usingdirname
等),但我将根据您的要求将其留给您。请在此询问您是否需要更多详细信息。