なぜ

なぜ

なぜ

まったく同じファイルを含める必要がある2つのフォルダがありますが、ファイル数を見ると異なります。どのファイル/フォルダが1つにあるが他のファイル/フォルダにないかを知りたいです。アイデアは、すべてのファイルを一覧表示し、commを使用して2つのフォルダ間の違いを見つけることです。

質問

/path/to/dir 形式と /path/to/dir/file 形式でファイルとフォルダのリストを繰り返し作成する方法は?

重要事項

オペレーティングシステム:Windows 11、サブシステムUbuntu 20.04.4 LTS

場所フォルダ:ネットワークドライブ1個、ローカルドライブ1個

フォルダサイズ:それぞれ〜2TB

ベストアンサー1

気づく目次Unixのファイルは、さまざまな種類のファイルの1つにすぎません。findを使用して検索するか、zsh globの修飾子を-type d使用できます。/その他のタイプ文書含む一般ファイル-type f.グローバル修飾子、おそらくあなたは文書)だけでなく、シンボリックリンク(-type l/ @)、デバイス、fifo、ソケット...

ファイルタイプのインポート目次、あなたはできます:

find dir1/ -type d

他の種類のファイルの場合:

find dir1/ ! -type d

についても同様ですdir2

3つの主な問題があります。

  • 印刷されたパスはdir1/fordir1dir2/forで始まり、dir2比較がより困難になります。
  • 順序はランダムです。
  • ファイルパスは 1 行に 1 つずつ作成されますが、改行はファイルパスの改行と同じくらい有効です。つまり、ファイルパスを複数行で構成できるため、出力を確実に後処理することはできません。

findこれらの問題は、GNUを介してsort次の方法を使用して解決できます。

find dir1/ -type f -printf '%P\0' | LC_ALL=C sort -z

どこ:

  • %P印刷ファイルパスdir1に基づいて
  • リストを並べ替えます(Cロケールでは、ファイルパスをテキストで構成する必要はありません)。
  • 0はファイルパスには現れない唯一のバイトなので、行ではなくNULで区切られたレコードを使用します。

これで、そのリストを次のものと比較できます。

list() {
  find "$@" -printf '%P\0' | LC_ALL=C sort -z
}
echo Directory differences:
comm -z3 <(list dir1/ -type d) <(list dir2/ -type d) | tr '\0' '\n'
echo Non-directory differences:
comm -z3 <(list dir1/ ! -type d) <(list dir2/ ! -type d) | tr '\0' '\n'

comm表示のためにNULを改行文字に戻し、TABを使用してファイルパスから有効な列を再び分離するため、この出力は確実に後処理できません。

あるいは、zsh配列にリストを取得し、その配列比較演算子を使用することもできます。

dirs_in_dir1=( dir1/**/*(ND/:s:dir1/::) )
dirs_in_dir2=( dir2/**/*(ND/:s:dir2/::) )
nondirs_in_dir1=( dir1/**/*(ND^/:s:dir1/::) )
nondirs_in_dir2=( dir2/**/*(ND^/:s:dir2/::) )

それから:

dirs_only_in_dir1=( ${dirs_in_dir1:|dirs_in_dir2} )
dirs_only_in_dir2=( ${dirs_in_dir2:|dirs_in_dir1} )
nondirs_only_in_dir1=( ${nondirs_in_dir1:|nondirs_in_dir2} )
nondirs_only_in_dir2=( ${nondirs_in_dir2:|nondirs_in_dir1} )

そして、この配列をolumnprintに入れるなどの作業を行います。r1 C

print -rC1 -- $array

(またはNオプションを追加して後処理が可能になるようにULを分離しました-N。)

おすすめ記事