質問: 2つのディレクトリA,Bがあり、入っているファイルがxxx,yyy,zzzとします。 A: xxx3-2, yyy2-1 B: xxx4-1, zzz3-1 とする場合、結果として、 only in A: yyy, only in B: zzzが欲しいのですが何か良い方法はないでしょうか。 diffコマンドで比較をすると、ファイル名で比較されてしまいバージョンを考慮したファイルの存在の有無が 調べられず困っています。 かといって一つ一つfor文で回したり、Mapを使ったりするのはあまりしたくないと思い質問させていただきました。 BashやPerlなどで教えていただけると嬉しいです。 またファイルの数は2つのフォルダにそれぞれ10000程度ずつあり、バージョンの記述方法も様々なのですが、 良い方法があれば教えてください。
回答: ``` ls A B|tr -d '[0-9]-'|sort|uniq -u|xargs -n1 -I% find . -name %* #-> ./A/yyy2-1 #-> ./B/zzz3-1 ``` これで結果の意味は把握できるはずです(検証したのは例示されたものだけでです)。フォーマットを指定するなら ``` ls A B|tr -d '[0-9]-'|sort|uniq -u|xargs -n1 -I% find A -name %* -exec echo only in {} \;|sed 's/\//: /' #-> only in A: yyy2-1 ls A B|tr -d '[0-9]-'|sort|uniq -u|xargs -n1 -I% find B -name %* -exec echo only in {} \;|sed 's/\//: /' #-> only in B: zzz3-1 ``` 無駄に2回繰り返してるのが嫌ですが。 最大の問題点は,ファイル名,バージョンの記述方法に規則性がないという点です。規則性がないものにアルゴリズムという規則をあてはめてゆくのは,とても困難です。プログラムの問題というより,一見規則性がないファイル名等に規則を見出すという作業の方が厄介ですね。