如何仅 cp 到最新的目录名?

如何仅 cp 到最新的目录名?
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/

(您可以通过更改cpecho 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 环境中,用单行命令执行循环甚至更复杂的操作是很常见的。

相关内容