GNU/Linux >> Linux の 問題 >  >> Linux

Rsync の include および exclude オプションを使用して、パターンごとにディレクトリとファイルを含める

これが私の「人に釣りを教える」答えです:

Rsync の構文は明らかに直感的ではありませんが、理解する価値はあります。

<オール>
  • まず、-vvv を使用します rsync のデバッグ情報を表示します。
  • $ rsync -nr -vvv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
    
    [sender] hiding directory 1280000000 because of pattern *
    [sender] hiding directory 1260000000 because of pattern *
    [sender] hiding directory 1270000000 because of pattern *
    

    ここでの重要な概念は、rsync が各ディレクトリの包含/除外パターンを再帰的に適用することです。最初の包含/除外が一致するとすぐに、処理は停止します。

    評価する最初のディレクトリは /Storage/uploads です . Storage/uploads 1280000000/, 1260000000/, 1270000000/ あります ディレクトリ/ファイル。 file_11*.jpg に一致するものはありません 含める。それらはすべて * に一致します 除外する。したがって、それらは除外され、rsync は終了します。

    1. 解決策は、すべてのディレクトリを含めることです (*/ ) 最初。次に、最初の dir コンポーネントは 1260000000/, 1270000000/, 1280000000/ になります */ に一致するため .次の dir コンポーネントは 1260000000/ になります . 1260000000/ で 、 file_11_00.jpg --include="file_11*.jpg" に一致 ですので、含まれています。など
    $ rsync -nrv --include='*/' --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
    
    ./
    1260000000/
    1260000000/file_11_00.jpg
    1260000000/file_11_01.jpg
    1270000000/
    1270000000/file_11_00.jpg
    1270000000/file_11_01.jpg
    1280000000/
    1280000000/file_11_00.jpg
    1280000000/file_11_01.jpg
    

    https://download.samba.org/pub/rsync/rsync.1


    問題は --exclude="*" (たとえば) 1260000000/ を除外するように指示します ディレクトリなので、rsync そのディレクトリの内容を調べないため、ディレクトリに --include と一致するファイルが含まれていることに気付くことはありません .

    あなたが望むものに最も近いものはこれだと思います:

    rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
    

    (これには、すべてのディレクトリと、file_11*.jpg に一致するすべてのファイルが含まれます 、他のファイルはなし)、または おそらく これ:

    rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
    

    (同じ概念ですが、含まれるディレクトリについてはより明確です)。


    rsync 除外パターンの例を含める:

    "*"         means everything
    "dir1"      transfers empty directory [dir1]
    "dir*"      transfers empty directories like: "dir1", "dir2", "dir3", etc...
    "file*"     transfers files whose names start with [file]
    "dir**"     transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
    "dir***"    same as above
    "dir1/*"    does nothing
    "dir1/**"   does nothing
    "dir1/***"  transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...
    

    最後に、パスを評価するために最初に使用されるアスタリスクに頼らないでください。 "**dir" のように (パスではなく、単一のフォルダーまたはファイルに使用しても問題ありません)。また、3 つ以上のアスタリスクはファイル名には機能しないことに注意してください。


    Linux
    1. Bash を使用してファイルを検索してコピーする

    2. 「cp」コマンドを使用して特定のディレクトリを除外する方法は?

    3. zip ファイルを作成し、ディレクトリ構造を無視する

    1. Rsyncフィルター:1つのパターンのみをコピーしますか?

    2. スラッシュと rsync コマンド

    3. sed を使用して特定のパターンを置き換える

    1. ソースが安全に更新されている間にRsyncを使用していますか?

    2. exclude-from を使用して複数のファイルとディレクトリを除外する 6 つの rsync の例

    3. 一部のファイルのみを含めるために正規表現を使用して rsync