使用 Mac OS X 终端将选定的文件夹复制到新位置,并进行合并

使用 Mac OS X 终端将选定的文件夹复制到新位置,并进行合并

我有一个文件夹“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

相关内容