我的目录结构如下:
source-dir---
|----- file-1
|----- file-2
|----- file-3
|----- folder-1
|---- file-4
|---- file-5
我想将所有文件从源目录复制到目标目录并保持相同的文件夹结构,但我想避免file-5
从其子目录复制。
期望目标目录如下:
destination-dir---
|----- file-1
|----- file-2
|----- file-3
|----- folder-1
|---- file-4
是否可以使用cp
命令本身来实现上述行为?或rsync
任何特定的正则表达式使用find
命令?
答案1
这应该有效,仅排除file-5
从复制到任何级别的子目录source
目录,但如果它存在于顶层则不存在:
cd /path/to/source
find . ! -path './*/file-5' -type d,f -exec sh -c '
[ -d "$1" ] && echo mkdir -vp "/path/to/dest/$1" || echo cp -v "$1" "/path/to/dest/$1"
' sh_cp {} \;
如果您只想从特定子目录中排除该特定文件,请严格提及,例如./folder-1/file-5
仅从该目录中排除该文件。
如果您对试运行结果感到满意,请删除和命令echo
前面的内容。mkdir
cp
答案2
如果我理解正确,您想跳过从特定目录 (folder-1) 复制特定文件 (file-5),那么您可以指示 rsync 排除所述文件,如下所示:
$ rsync -avz -f'- folder-1/file-5' ~/source/ ~/destination/
答案3
这个问题让我想到要痛击通配
这是一个带有解释注释的小脚本:
#!/bin/bash
# Check that the arguments are two.
# Source and destination
[ ${#@} -eq 2 ] || exit 1
# Remove, a possible, traling backslash
src="${1%/}"
dst="${2%/}"
# Enalble needed option for gloobin
shopt -q extglob || shopt -s extglob
shopt -q globstar || shopt -s globstar
# Set here the name to ignore
GLOBIGNORE="$src"/*/file-5
for e in "$src"/**; do
# Skip the base directory
[ "$e" != "$src/" ] || continue
# If we process a directory then create it
# in the destionation
[ -d "$e" ] && echo mkdir "$dst/$e" && continue
# Plain file, do then copy
[ -f "$e" ] && echo cp "$e" "$dst/"
done
重命名脚本,例如:sample.sh
,然后调用为sample.sh src_path dst_path
高兴的时候去掉echo
。当然,您可以将 GLOBIGNORE 设置为您需要跳过的任何内容。