我有一个包含子目录的文件夹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 命令行方式来完成上述操作?
我建议为此使用 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 复制选项。
我希望这能为您指明正确的方向。
简单的答案是只复制你想要的目录:
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
如果你真的知道你的目录,只需将 all 添加到 scp:
scp A/* D/* targetHost:/copy
此解决方案的唯一问题是,它将您的文件“混合”在复制目录中。可能,这并不重要:-)