私のディレクトリ構造は次のとおりです。
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をスキップする必要がある項目に設定できます。