web-dev-qa-db-ja.com

rsyncから転送されたファイルのリストを取得しますか?

現在、PHPアプリケーションをステージングから本番サーバーにデプロイするスクリプトでrsyncを使用しています。方法は次のとおりです。

rsync -rzai --progress --stats --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/

これは現在、比較されているすべてのファイル(プロジェクト内のすべてのファイル)のリストを出力していますが、変更されたファイルのみを出力したいので、--dry-runオプションで実行してすべてを確認できますデプロイは、必要なファイルのみを更新しています。

注:これまでにできる最善の結果はgrep fcst結果ですが、rsyncオプションを探していますが、そこにあると確信していますが、マニュアルページで見つけることができません。 。

前もって感謝します!

15
Mauro

あなたが求めていることを正確に行うためのrsyncオプションがある場合、私はそれをマンページでも見つけませんでした。 :-)

とはいえ、必要なものを正確に解析するためにrsync -iの出力をgrepすることに問題があるとは思いません。それは私にはナイスでUnixyだと感じています。

Rsyncコマンドを使用した1つの簡単な問題:-rは、-aによって暗示されるため、冗長です。

6
Kevin DeGraaf

--out-formatオプションを使用する

マニュアルページによると:

--out-formatオプションを指定すると、重要な方法で更新される各ファイル、ディレクトリなど(転送されたファイル、再作成されたシンボリックリンク/デバイス、またはディレクトリ)が言及されます。

実際のファイル名(--out-format="%n")のみが必要な場合、ドライランコマンドは次のようになります。

rsync -rzan --out-format="%n" --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/


-vを指定してrsyncを呼び出すと、内部でこのオプションがデフォルトの形式"%n%L"で使用されます。これにより、ファイルの名前と、アイテムの場合はそれが指すリンクであることがわかります。

ただし、これには同期プロセスの最初と最後の短い要約も含まれます。

その概要を取り除くには、--out-formatオプションを直接使用します。

ところで-iも内部的に--out-formatを使用しますが、形式は"%i %n%L"です。

7
flu

2013年にリリースされたrsync v3.1.0から、--infoフラグ。出力を細かく制御できます。

 --info=FLAGS
          This option lets you have fine-grained control over the information output you want to see.  An individual flag name may be followed
          by a level number, with 0 meaning to silence that output, 1 being the default output level, and higher numbers increasing the output
          of that flag (for those that support higher levels).  Use --info=help to see all the available flag names,  what  they  output,  and
          what flag names are added for each increase in the verbose level.  Some examples:

              rsync -a --info=progress2 src/ dest/
              rsync -avv --info=stats2,misc1,flist0 src/ dest/

          Note  that  --info=name’s  output  is  affected  by the --out-format and --itemize-changes (-i) options.  See those options for more
          information on what is output and when.

          This option was added to 3.1.0, so an older rsync on the server side might reject your attempts at fine-grained control (if  one  or
          more  flags  needed  to  be  send to the server and the server was too old to understand them).  See also the "max verbosity" caveat
          above when dealing with a daemon.

利用可能な--infoフラグは次のとおりです。

Use OPT or OPT1 for level 1 output, OPT2 for level 2, etc.; OPT0 silences.

BACKUP     Mention files backed up
COPY       Mention files copied locally on the receiving side
DEL        Mention deletions on the receiving side
FLIST      Mention file-list receiving/sending (levels 1-2)
MISC       Mention miscellaneous information (levels 1-2)
MOUNT      Mention mounts that were found or skipped
NAME       Mention 1) updated file/dir names, 2) unchanged names
PROGRESS   Mention 1) per-file progress or 2) total transfer progress
REMOVE     Mention files removed on the sending side
SKIP       Mention files that are skipped due to options used
STATS      Mention statistics at end of run (levels 1-3)
SYMSAFE    Mention symlinks that are unsafe

ALL        Set all --info options (e.g. all4)
NONE       Silence all --info options (same as all0)
HELP       Output this help message

Options added for each increase in verbose level:
1) COPY,DEL,FLIST,MISC,NAME,STATS,SYMSAFE
2) BACKUP,MISC2,MOUNT,NAME2,REMOVE,SKIP
4
Corneliu

実際には、元のコマンドに既に含まれているので、あなたは自分の質問にある程度答えました:--progress

これは正しいオプションですが、manページは少し不可解です。

     --progress              show progress during transfer
 -P                          same as --partial --progress

少し理にかなっています。rsync文字列をドライランモードで呼び出すので、トランザクションは発生しませんが、進行状況は変わりません。つまり、変更されて転送されるファイルです。

このようにして、すべてのファイルのきちんとした小さなリストを取得します。次に例を示します。

宛先には、ソースで更新されたchangedfileのコピーとoldfileがすでにあり、変更されていません。ソースには、追加ファイルnewfileもあります。

#~$ ls -lhan /tmp/destination/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:08 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile



#~$ ls -lhan /tmp/source/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:15 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 newfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile

次に、rsyncコマンドを呼び出しますが、項目化を削除すると-iとドライランを追加する-n

#~$ ~$ rsync -n -rza --progress --stats --ignore-times --checksum /tmp/source/ /tmp/destination/
sending incremental file list
changedfile
newfile

Number of files: 4 (reg: 3, dir: 1)
Number of created files: 1 (reg: 1)
Number of deleted files: 0
Number of regular files transferred: 2
Total file size: 2 bytes
Total transferred file size: 2 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 187
Total bytes received: 22

sent 187 bytes  received 22 bytes  418.00 bytes/sec
total size is 2  speedup is 0.01 (DRY RUN)

Rsyncが転送するファイルのみのリストが表示されます:changedfileおよびnewfile。

0
Robert Riedl

これが使用するバージョン/オプション間で異なるかどうかはわかりませんが、mysバージョンで-iオプションを使用すると、次のようなリストが表示されます。

>f..T...... existing-file.png
>f+++++++++ new-file.png
cd+++++++++ new-dir/
>f+++++++++ new-dir/new-file.png

したがって、実際に転送されるファイルのリストのみを取得する簡単なソリューションは、次のように実行します。

rsync [your options here] | grep -v "f..T......"

これにより、f..T......を含むすべての行が非表示になります。したがって、これは事実上、同一のファイルを非表示にします。

0
Nux