はじめに
本記事は、All About Group(株式会社オールアバウト) Advent Calendar 2023 6日目の投稿です。
ディレクトリaとディレクトリbの間で重複しているサブディレクトリやファイルの情報を調べたい人がどこかにいるかもしれないので記録します。
↑の記事をベースにしました。
前提
以下のようなディレクトリがあるとします。
$ tree
.
├── a
│ ├── alice.txt
│ ├── carol.txt
│ ├── dave.txt
│ ├── dinner
│ │ ├── rice.txt
│ │ └── steak.txt
│ └── morning
│ ├── bread.txt
│ └── soup.txt
└── b
├── alice.txt
├── bob.txt
├── carol.txt
├── dinner
│ ├── rice.txt
│ └── steak.txt
└── lunch
├── bread.txt
└── soup.txt
7 directories, 14 files
1階層のみ重複ファイル/ディレクトリ名を表示する
$ (ls a; ls b) | sort | uniq -d
alice.txt
carol.txt
dinner
- aディレクトリとbディレクトリをlsする
- 表示された一覧をsortする
- uniq -d で重複する行だけを出力する
階層が1つだけならこれで良いです。
サブディレクトリ含め重複ファイル/ディレクトリ名を表示する
$ (ls -R a; ls -R b) | sort | uniq -d
alice.txt
bread.txt
carol.txt
dinner
rice.txt
soup.txt
steak.txt
- 上のコマンドの ls に再帰の -R オプションを付けただけ
ただし ls なので、ファイル名だけの重複を調べており、ファイルパスを含めた比較にはなっていません。
サブディレクトリ含めファイルパスの重複を表示する
$ (find ./a | awk '{print substr($1, 4)}'; find ./b | awk '{print substr($1, 4)}') | sort | uniq -d
/alice.txt
/carol.txt
/dinner
/dinner/rice.txt
/dinner/steak.txt
- aディレクトリ以下をfindする
- awkを使い表示されたパスの先頭x文字を切り取る(例の場合は4文字 "./a/" の部分)
- bディレクトリも同様に実行する
- 表示された一覧をsortする
- uniq -d で重複する行だけを出力する
ファイルパスの重複確認だけならこれで十分です。
サブディレクトリ含めファイルサイズなどの情報も含めて重複を表示する
$ (find ./a -ls | awk '{print substr($11, 4), $7}'; find ./b -ls | awk '{print substr($11, 4), $7}') | sort | uniq -d
224 <- aディレクトリ, bディレクトリのサイズ表示
/carol.txt 9
/dinner 128
/dinner/rice.txt 24
-
aディレクトリ以下をfindして、情報はls -dgilsの形式で表示する
-
awkを使い比較したい情報を切り取って表示する
-
bディレクトリも同様に実行する
-
表示された一覧をsortする
-
uniq -d で重複する行だけを出力する
なお、パスに大文字小文字が混在している場合は、sortに -f オプション、uniqに -i オプションを追加します。
(find ./a -ls | awk '{print substr($11, 4), $7}'; find ./b -ls | awk '{print substr($11, 4), $7}') | sort -f | uniq -d -i
重複でなく、差分表示の場合はuniqのオプションを -u に変更します(こちらの方が需要が多いかもしれませんね)。
(find ./a -ls | awk '{print substr($11, 4), $7}'; find ./b -ls | awk '{print substr($11, 4), $7}') | sort -f | uniq -u -i
さらっと書きましたがかなり試行錯誤しました。
誰かのお役に立てれば幸いです。