現在、PHPアプリケーションをステージングから本番サーバーにデプロイするスクリプトでrsync
を使用しています。方法は次のとおりです。
rsync -rzai --progress --stats --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/
これは現在、比較されているすべてのファイル(プロジェクト内のすべてのファイル)のリストを出力していますが、変更されたファイルのみを出力したいので、--dry-run
オプションで実行してすべてを確認できますデプロイは、必要なファイルのみを更新しています。
注:これまでにできる最善の結果はgrep fcst
結果ですが、rsync
オプションを探していますが、そこにあると確信していますが、マニュアルページで見つけることができません。 。
前もって感謝します!
あなたが求めていることを正確に行うためのrsyncオプションがある場合、私はそれをマンページでも見つけませんでした。 :-)
とはいえ、必要なものを正確に解析するためにrsync -i
の出力をgrepすることに問題があるとは思いません。それは私にはナイスでUnixyだと感じています。
Rsyncコマンドを使用した1つの簡単な問題:-r
は、-a
によって暗示されるため、冗長です。
--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"
です。
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
実際には、元のコマンドに既に含まれているので、あなたは自分の質問にある程度答えました:--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。
これが使用するバージョン/オプション間で異なるかどうかはわかりませんが、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......
を含むすべての行が非表示になります。したがって、これは事実上、同一のファイルを非表示にします。