なぜ
まったく同じファイルを含める必要がある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/
fordir1
とdir2/
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
に入れるなどの作業を行います。r
1
C
print -rC1 -- $array
(またはN
オプションを追加して後処理が可能になるようにULを分離しました-N
。)