mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/
这仅复制到 test_dir3,而不复制到 test_dir、test_dir1、test_dir2。为什么?
就此而言,它仅复制到最新目录(例如 test_dir4),而不是复制到任何其他目录(它省略了它们)。
答案1
你有这三个命令
mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/
.
假设在示例启动之前没有其他文件或目录,则最后一行中的通配符将扩展如下:
cp -v file1 file2 file3 test_dir/ test_dir1/ test_dir2/ test_dir3/
(您可以通过更改cp
为echo cp
并观察结果来看到这一点。)您没有告诉我们的是生成的诊断消息cp -v
,它显示了它正在尝试执行的操作,即将命令行上的每个项目(但最后一项)复制到最后一项,因此该项必须是一个目录:
‘file1’ -> ‘test_dir3/file1’
‘file2’ -> ‘test_dir3/file2’
‘file3’ -> ‘test_dir3/file3’
cp: omitting directory ‘test_dir/’
cp: omitting directory ‘test_dir1/’
cp: omitting directory ‘test_dir2/’
答案2
因为cp
命令是这样工作的。如果它有 2 个以上的参数,最后一个参数必须是一个目录,并且在此之前的每个参数都将被复制到其中。
我认为您需要一个cp
行为更像 Windowscopy
命令的工具,是的,确实有这样的工具,尽管它们并不常用。甚至我也不得不谷歌搜索。
您的实际目标可以通过一个简单的循环轻松实现:
for i in test_dir*; do cp -v test_file* $i; done
它比乍一看要简单得多。Bash 实际上是一种类似 basic 的编程语言,在 unix 环境中,用单行命令执行循环甚至更复杂的操作是很常见的。