
私のローカルディレクトリとリモートディレクトリを比較したいです。
例: 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
行全体を抽出します。$0
0
(length(prev))
!= prev
:現在の行の部分文字列を前の行と比較します。デフォルトでは、現在の行(サブ文字列)が前の行の文字列で始まるかどうかをテストします。ここではエスケープする必要があるため、行の先頭に固定された単純な正規表現を使用しません。{print $0; prev = $0}
:現在行の場合する前の行から始まり、その行がある場合は無視します(つまり、印刷しません)。いいえ一致すると新しいディレクトリになるため、行全体が印刷され、print $0
新しい行がprev
変数に保存されますprev = $0
。
答え2
最良の方法は、find <dir> -maxdepth 1 -type d
2つのディレクトリにそれを使用してからソートされた結果を比較することです。 Paul Tのソリューションと似ていますが、深さ制限があり、ディレクトリのみが考慮されます。
$ cd <local_folder>; find . -type d -maxdepth 1 | sort > ~/local-list.txt
$ cd <remote_folder>; find . -type d -maxdepth 1 | sort > ~/remote-list.txt
$ diff -u ~/remote-list.txt ~/local-list.txt