使用cp -ur,但只更新目录

时间:2016-11-12 11:57:09

标签: bash filesystems cp

我有两个目录,我想要包含大部分相同的信息。 我写了基本脚本

#!/bin/bash

# Update the two folders
cp -vur ../catkin_ws/src .
cp -vur . ../catkin_ws/src

现在我想更改它,只更新目录及其内容,但不更新顶级目录中的其他文件,如bash脚本本身。

如果无法做到这一点,有没有办法在更新期间排除某些文件?

1 个答案:

答案 0 :(得分:0)

假设您要将../catkin_ws/src与当前目录同步,并且当前脚本位于当前目录中。据我所知,您只想同步顶级目录(包括其内容),而不是同步位于顶层的其他类型的节点,即直接在../catkin_ws/src./内。 / p>

然后使用find命令轻松完成:

src_dir="../catkin_ws/src"

find "$src_dir" -mindepth 1 -maxdepth 1 -type d \
  -exec cp -vru {} . \;

find ./ -mindepth 1 -maxdepth 1 -type d \
  -exec cp -vru {} "$src_dir" \;

其中{}代表找到的下一个目录。

如果您想进一步过滤,可以使用其他选项,例如-name-path-regex。例如,以下跳过目录x

find "$src_dir" -mindepth 1 -maxdepth 1 -type d \
  ! -name 'x' \
  -exec cp -vru {} . \;

其中!导致下一个表达式返回True,如果表达式为false,则表示作为某种逻辑NOT运算符。

上述命令的缺点是按顺序为每个文件夹启动cp命令(由于\;)。如果要为所有源运行单cp命令,可以使用this answer中描述的方法。

P.S。

我没有尝试建议更好的方法来同步目录,但只建议了一种方法来修复当前的方法。