1

我有一个包含子目录的文件夹A,B,C and D。我需要将目录复制A and D到另一个'copy'在排除时调用的目录B and C(即 B 和 C 不会被复制)。我正在考虑执行以下操作(在命令行伪代码中):

ls (selective ls on the source directory) | 
   scp -r {returned value from the ls} {target directory}

是否有 Linux 命令行方式来完成上述操作?

4

3 回答 3

3

我建议为此使用 find 。

让我们创建一些测试主题:

$ mkdir -p ./testing/test{1,2,3,4}
$ touch ./testing/test{1,2,3,4}/test{a,b}

将导致:

$ ls -R ./testing
./testing:
test1  test2  test3  test4

./testing/test1:
testa  testb

./testing/test2:
testa  testb

./testing/test3:
testa  testb

./testing/test4:
testa  testb

现在,运行

$ mkdir ./testing/copy
$ find ./testing/ -mindepth 1 -maxdepth 1 ! -name test1 ! -name test3 ! -name copy -execdir cp -R '{}' ./copy/ ';'

将导致:

$ ls -R ./testing/
./testing/:
copy  test1  test2  test3  test4

./testing/copy:
test2  test4

./testing/copy/test2:
testa  testb

./testing/copy/test4:
testa  testb

./testing/test1:
testa  testb

./testing/test2:
testa  testb

./testing/test3:
testa  testb

./testing/test4:
testa  testb

背景资料:

总结:找到需要复制的目录,执行复制命令。在这种情况下,让我们复制除“test1”和“test3”之外的所有目录。

-mindepth 1选项将阻止 find 包含 . 可能还有 .. 目录,因为它们位于深度 0 上。

-maxdepth 1选项将阻止 find 单独复制每个子目录。命令 cp -R 处理子目录,因此它们被覆盖。

使用-execdir而不是 -exec,因此您不必包含整个路径作为 cp 命令的目标目录。

在运行 find 之前不要忘记 mkdir 你的目标目录,并且不要忘记从结果中排除这个目录!因此!我的示例中的-name 复制选项。

我希望这能为您指明正确的方向。

于 2012-06-04T16:08:27.800 回答
2

简单的答案是只复制你想要的目录:

scp -r A D anotherhost:/path/to/target/directory

这将完全按照您在示例中描述的方式进行。更通用的解决方案可能如下所示:

scp -r $(ls | egrep -v '^(B|C)$') anotherhost:/path/to/target/directory

只要源目录中的文件数量不大,此命令就会起作用。随着文件数量的增加,您最终会遇到“命令太长”错误。

scp您可以使用代替 using ,rsync它具有多种包含/排除文件的机制。例如:

rsync --exclude='B/' --exclude='C/' . anotherhost:/path/to/target/directory
于 2012-06-04T15:35:18.207 回答
0

如果你真的知道你的目录,只需将 all 添加到 scp:

scp A/* D/* targetHost:/copy

此解决方案的唯一问题是,它将您的文件“混合”在复制目录中。可能,这并不重要:-)

于 2012-06-04T15:35:04.127 回答