--include=file オプションを使用すると、RSYNC は何もコピーしません。

--include=file オプションを使用すると、RSYNC は何もコピーしません。

ソースの一部をターゲットにコピーしたいです。

SRC_DIR=/a/b/c/d/e  
DEST_DIR=/x/y/z/d/e

スクリプトが起動すると、次の場所にすべてのフォルダが作成されます$DEST_DIR

mkdir -pv /x/y/z/d/e  

ソースの相対パスのリストがあり、これがeコピーする最初のサブパスです。リストは、次のようにfindコマンドの出力から作成されます。

/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root  
....  
....  
/002_DATA/SSH/2023_09_01.prev/root  
....   
....   
....  
/002_DATA/USER_CONFIG_INITIAL/root  
....   
....  
....  
....  
/001_SCRIPTS/000_TOOLS/root  
....   
....  

包含リストを作成するには、まず親フォルダを配置し、次に検索出力から取得したリストを配置します。リストは次のとおりです。

/a  
/a/b  
/a/b/c  
/a/b/c/d  
/a/b/c/d/e  
/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root  
....  
....  
/002_DATA/SSH/2023_09_01.prev/root  
....   

最後のコマンドは次のとおりです。

rsync -arzh -vvv --include='/tmp/000_my_include_root_dirlist.txt' --exclude='*' "$SRC_DIR/"  "$DST_DIR/"

U&L Stack Exchangeで見つけた多くのヒントを試しましたが、成功しませんでした。私は何が間違っていましたか?

さて、Chrisの提案は小さなフォルダセットに適用されます。私の問題は、--recursiveオプションが欠落しており、フォルダの固定ビットを使用しているために発生します。完全なテストをしてみます。できるだけ早くお知らせいたします。

答え1

オプションにはコンテンツ以外の--include='/tmp/000_my_include_root_dirlist.txt'ファイルが含まれます。"$SRC_DIR/tmp/000_my_include_root_dirlist.txt"おそらくあなたは望むでしょうし、--files-from両方--includeを望んでいません--exclude

rsync --dry-run -ah -vv --files-from='/tmp/000_my_include_root_dirlist.txt' "$SRC_DIR/"  "$DST_DIR"

次に、ファイルリストから最初のグループを削除し、リストされている/a残りのファイルに1行に1つずつ相対パスがあることを確認します。たとえば、代表します。/a/b/c/d/e$SRC_DIR/my_file.txt"$SRC_DIR/my_file.txt"

私はそれが何をするかを示すために--dry-runそれを追加しました。rsync実装する準備ができたら、このオプションを削除してください。また、.and-rの一部だったので、重複したコンテンツを削除しました。ローカルにコピーすると意味がないからです。-a-z

また、コピーするファイルのリストを直接作成できますが、コピーするファイルのリストを作成したいと思う理由は少し混乱しますrsync。 (findファイルセットを制限するために他の基準を適用した可能性があります。)

答え2

あなたが言ったように、そしてUSER_CONFIG_COPY002_DATA001_SCRIPTS サブディレクトリであるならば、あなたはその項目を前に  e置かないでください(例えば)。 " "はこのディレクトリにあることを意味します。//USER_CONFIG_COPY/USER_CONFIG_COPYUSER_CONFIG_COPY目次。

cd実行し/a/b/c/d/eて実行すると、次findのような結果が表示されます。

./USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
./002_DATA/SSH/2023_09_01.prev/root

これ .最初のsは装飾用ではありません。ただ置くことはできません。これは、パスが次に関連付けられていることを示します。.、現在のディレクトリ(つまり/a/b/c/d/e)です。

同様に実行すると、次のような結果が得られます。find "$SRC_DIR/" criteria

/a/b/c/d/e/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
/a/b/c/d/e/002_DATA/SSH/2023_09_01.prev/root

パイプと仮定するsed 's#^'$PATH_INCLUDE_FROM'##'と、$PATH_INCLUDE_FROM表示/a/b/c/d/eされる出力も得られます。これも間違っています。引用した場合、/a/b/c/d/e/USER_CONFIG_COPY/...1行に入れて次の行に入れるのは正しいことではありません。各行は有効なファイル名でなければなりません。/a/b/c/d/e/USER_CONFIG_COPY/...

さて、

  • 同じディレクトリを参照する2つの変数(SRC_DIRおよび)があるのはなぜですか?PATH_INCLUDE_FROM
  • 's#^'$PATH_INCLUDE_FROM'##'文法エラー。代わりに"s#^$PATH_INCLUDE_FROM##"(二重引用符を含む)を使用してください"

関連情報