質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

1716閲覧

バージョンを考慮したファイルの有無を調べたい

git

総合スコア8

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2016/02/16 13:58

編集2016/02/16 14:12

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程度ずつあり、バージョンの記述方法も様々なのですが、
良い方法があれば教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Bash

1ls A B|tr -d '[0-9]-'|sort|uniq -u|xargs -n1 -I% find . -name %* 2#-> ./A/yyy2-1 3#-> ./B/zzz3-1

これで結果の意味は把握できるはずです(検証したのは例示されたものだけでです)。フォーマットを指定するなら

bash

1ls A B|tr -d '[0-9]-'|sort|uniq -u|xargs -n1 -I% find A -name %* -exec echo only in {} \;|sed 's/\//: /' 2#-> only in A: yyy2-1 3ls A B|tr -d '[0-9]-'|sort|uniq -u|xargs -n1 -I% find B -name %* -exec echo only in {} \;|sed 's/\//: /' 4#-> only in B: zzz3-1

無駄に2回繰り返してるのが嫌ですが。

最大の問題点は,ファイル名,バージョンの記述方法に規則性がないという点です。規則性がないものにアルゴリズムという規則をあてはめてゆくのは,とても困難です。プログラムの問題というより,一見規則性がないファイル名等に規則を見出すという作業の方が厄介ですね。

投稿2016/02/17 02:14

NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

git

2016/02/20 10:12

-Iの後ろの%はどういう処理になるのでしょうか、調べてみたのですが良く分かりませんでした。申し訳ありません。
NCC1701

2016/02/20 10:34

xargsがコマンドに渡す引数の位置を変更するのに使うオプション-Iのマーカーです。 xargsは後続のコマンドやオプションの一番後ろに引数を並べて実行するので,一番後ろだと都合が悪い場合に使ってます。 ```sh echo A B C|xargs mv dir #-> mv dir A B C (dir A BをCに移動する意味になる) echo A B C|xargs -I% mv % dir #-> mv A B C dir (A B Cをdirに移動する意味になる) ``` %は別の文字でも良いようです。
git

2016/02/20 10:59

なるほど、ありがとうございます!
git

2016/02/20 12:16

再度質問で申し訳ないのですが、sortがあると動作しません。実行環境はcygwinなのですが、何か原因などご存知ないでしょうか。。
NCC1701

2016/02/20 12:44

当方UNIX(OSX)のため不明です。ただcygwin sortで検索したら次のような事例がヒットしたので,関係あるかもしれません。(sort findコマンドが無いとは考えにくいので。) http://tm.root-n.com/tool:application:find_sort
guest

0

バージョンの記述方法も様々なのですが、

ということだと、どうしようも無いかと。
とりあえず、「数字 ハイフン 数字 つまり正規表現で/\d+-\d+/の形の物が末尾にある」ケースのみだとすると、

Bash

1#!/bin/bash 2foo(){ 3 comm -23 <(/bin/ls "$1" | sed -r 's/[0-9]+-[0-9]+$//') \ 4 <(/bin/ls "$2" | sed -r 's/[0-9]+-[0-9]+$//') 5} 6 7echo only in A: 8foo A B 9echo only in B: 10foo B A

あとは、バージョン番号を削除する正規表現を追加してください。

投稿2016/02/16 14:23

otn

総合スコア84487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

git

2016/02/20 11:00

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問