我有一个文件夹“foo”,其中包含很多子文件夹,例如
foo
|---20101
|---20102
|---20103
|---20111
|---20112
|---20113
还有更多,但希望它能解释这种情况。我现在想将此文件夹中所有以“2011”开头的文件夹复制到“foo”的兄弟文件夹“bar”中。但是,“bar”已经包含一些同名文件夹
bar
|---20111
|---20113
|---20114
源文件夹和目标文件夹的内容应合并。请注意,脚本还需要创建一个 bar/20112 文件夹,因为该文件夹不存在。
我是 Mac 终端脚本的新手,并已成功 grep 正确的文件夹
foo>ls | grep ^2011
其中列出了正确的文件夹,但我不知道如何将其传送到适当的复制操作。
答案1
复制命令是cp
。如果你给它-r
(递归)标志,它将完全按照你的要求执行,它会将文件复制到现有文件夹中,并在目标文件夹丢失时创建新文件夹。
然而,你永远不应该解析ls
,你应该使用find
,或者更简单,bash 通配符:
cp -rv foo/2011* bar/
如果有文件和文件夹的名称以 开头2011
,则使用find
及其-exec
选项,它将把您给出的任何命令应用于find
(称为{}
)找到的所有内容:
find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;
在这种特定情况下,没有必要保存命令的输出并将其传递给cp
。但有时这是必要的,因此这里介绍如何完成。通常,如果将命令的输出放在倒逗号或 内,则可以将其作为另一个命令的输入$()
。
cp -rv `find foo/ -type d -name "2011*"` bar/
或者
cp -rv $(find foo/ -type d -name "2011*") bar/
或者,您可以循环遍历结果:
for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done
如果您的文件/文件夹名称可以包含特殊字符或换行符等,情况会变得更加复杂,在这种情况下您应该执行以下操作:
find foo/ -type d -name "2011*" | while IFS= read -r dir; do
cp -rv "$dir" bar/;
done