ディレクトリ内のすべてのファイルはコピーされますが、サブディレクトリ内の特定のファイルはコピーされません。

ディレクトリ内のすべてのファイルはコピーされますが、サブディレクトリ内の特定のファイルはコピーされません。

私のディレクトリ構造は次のとおりです。

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をスキップする必要がある項目に設定できます。

関連情報