复制目录中的所有文件,但不复制子目录中的特定文件

复制目录中的所有文件,但不复制子目录中的特定文件

我的目录结构如下:

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前面的内容。mkdircp

答案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 设置为您需要跳过的任何内容。

相关内容