我有一个包含子目录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命令行方式来完成上述工作?
答案 0 :(得分: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
背景资料:
摘要:找到需要复制的目录并执行copy命令。在这种情况下,让我们复制所有目录,但'test1'和'test3'。
-mindepth 1 选项会阻止find包括。可能..目录,因为它们在深度为0。
-maxdepth 1 选项将阻止find单独复制每个子目录。命令cp -R处理子目录,因此它们被覆盖。
使用 -execdir 而不是-exec,因此您不必将整个路径包含为cp命令的目标目录。
在运行find之前不要忘记mkdir你的目标目录,不要忘记从结果中排除这个目录!因此!我的示例中的-name copy 选项。
我希望这能指出你正确的方向。
答案 1 :(得分:2)
简单的答案是只复制你想要的目录:
scp -r A D anotherhost:/path/to/target/directory
这将完全按照您在示例中描述的内容执行。更通用的解决方案可能如下所示:
scp -r $(ls | egrep -v '^(B|C)$') anotherhost:/path/to/target/directory
只要源目录中的文件数不大,此命令就会起作用。随着文件数量的增加,您最终会遇到“命令太长”的错误。
您可以使用scp
代替使用rsync
,rsync --exclude='B/' --exclude='C/' . anotherhost:/path/to/target/directory
具有各种包含/排除文件的机制。例如:
{{1}}
答案 2 :(得分:0)
如果你真的知道你的目录,只需将所有内容添加到scp:
scp A/* D/* targetHost:/copy
此解决方案的唯一问题是,它将文件“混合”在复制目录中。可能无关紧要: - )