ローカルディレクトリとリモートディレクトリの違い

ローカルディレクトリとリモートディレクトリの違い

私のローカルディレクトリとリモートディレクトリを比較したいです。

例: 2 つのディレクトリをローカルおよびリモートで処理

|-local
|  |--aaa
|  |   |--file1
|  |   |--file2
|  |
|  |--bbb
|  |   |--file1
|  |   |--file2
|  |-file1
|
|-remote
   |--ddd
       |--file1
       |--file2

rsyncを実行しようとすると

rsync -avcn local/ remote/

私は次のような結果を得ます。

./
file1
aaa/
aaa/file1
aaa/file2
bbb/
bbb/file1
bbb/file2

すべてのファイルがローカルでも欠落している場合にのみフォルダ名を取得する方法はありますか?

例外出力:

file1
aaa/
bbb/

ここでは、file1とfile2の両方が「aaa」と「bbb」として表示されるため、出力にはフォルダ名のみが表示されます。

ベストアンサー1

次のawkスクリプトにコマンドをパイプできます。

$ rsync -avcn local/ remote/ | awk 'BEGIN {prev="./"} substr($0, 0, (length(prev))) != prev {print $0; prev = $0}'
file1
aaa/
bbb/

説明する

  • {prev="./"}:入力読み取りを開始する前に、変数を(出力の最初の行)prevに設定してください。./これから、この変数を使用して前の行の内容を保存します。
  • substr($0, 0, (length(prev))):最初の文字から始めて前の行までのsubstr行全体を抽出します。$00(length(prev))
  • != prev:現在の行の部分文字列を前の行と比較します。デフォルトでは、現在の行(サブ文字列)が前の行の文字列で始まるかどうかをテストします。ここではエスケープする必要があるため、行の先頭に固定された単純な正規表現を使用しません。
  • {print $0; prev = $0}:現在行の場合する前の行から始まり、その行がある場合は無視します(つまり、印刷しません)。いいえ一致すると新しいディレクトリになるため、行全体が印刷され、print $0新しい行がprev変数に保存されますprev = $0

おすすめ記事