如何在执行文件操作(即 cp 等)时排除文件夹。
我目前使用通配符 * 将文件操作应用于所有,但我需要排除一个文件夹。
我实际上想要使用的命令是chown
更改目录中所有文件的所有者,但我需要排除一个子目录。
答案1
逆向通配符:
你想要一个逆向匹配我将像下面这样进行操作:
如果启用了扩展通配符,则可以使用较新的 bash 进行反向匹配。例如,要匹配名称中不包含 foo 或 bar 的所有内容:
shopt -s extglob
echo !(*foo*|*bar*)
或者只是没有 foo 的所有内容:
shopt -s extglob
echo !(*foo*)
寻找:
您还可以使用 find (我认为这是最强大的选项),并使用 ! 来否定匹配,然后使用以下命令运行命令xargs -0
:
find . ! -iname 'foo' -print0 | xargs -0 echo
简单的:
只需将文件夹移动到其他位置,执行您需要的操作,然后将其放回原处:-)
答案2
rsync -arv --exclude={文件} {目标}
答案3
find 解决方案为每个文件生成一个 chown 进程,有时这可能会带来问题。此解决方案仅生成一个 perl 进程:
find . | perl -nle "chown($(id -u user), $(id -g group), \$_) unless m/foo/"