特定の深さまでのパスのフィルタリング

特定の深さまでのパスのフィルタリング

-nPaAXz ~/コピーするファイルを確認するためにrsyncとフラグを使用しています。

理解するには長すぎます。

特定の深さにコピーされるファイル/フォルダのリストを表示するために出力をフィルタリングするにはどうすればよいですか?たとえば、次のようになります。

フォルダ1つ

/home/afile
/home/afolder/
/home/anotherfolder/

フォルダ2つの深さ

/home/afile
/home/afolder/afile
/home/afolder/anotherfile
/home/afolder/afolder/
/home/anotherfolder/afile

答え1

次のgrepは、rsyncの詳細出力を2つのフォルダの深さに制限します。

rsync -nPaAXz src_dir dst_dir | grep -E '^/?([^/]+/?){0,2}$'

{0,2}上記を変更して{0,3}3つのフォルダをフィルタリングします。{0,4}4つのフォルダの深さなどをフィルタリングします。

答え2

このコマンドは各パスを取得し、n深いフォルダ(\{0,n\}コマンドセクションsed{0,n}grepコマンドセクションで定義)に切り捨てます。その後、パイプを介してuniq重複項目をフィルタリングします。

rsync -nPaAXz src_dir dst_dir | sed -n 's@^\(\([^/][^/]*/\)\{0,2\}\).*@\1@p' | uniq

以下を使用して同じ効果を得ることができますgrep

rsync -nPaAXz src_dir dst_dir | grep -oE "^([^/]+/){0,2}"

GNU grep上記はバージョンには適用されませんが、< 2.5.3抜け穴

答え3

この場合、出力をフィルタリングするだけで、何らかの方法で値を再利用することには興味がありません。まあ、簡単です。必要以上にスラッシュを含む行を見つけます。

答え4

rsync -nPaAXz src_dir dst_dir | cut -d "/" -f 1-4 | awk '!x[$0]++'

cut は 4 つのフォルダー深度パスの後のすべての項目を削除し、awk は重複項目を削除します。

関連情報