• ベストアンサー

applescriptでファイルの比較

MacOS 9.2を使用しています。AppleScriptで2つのファイルを比較して差異があった場合にそれをテキストファイルに出力することはできますでしょうか?できるならその記述方法を教えてください。

  • Mac
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • qntmphscs
  • ベストアンサー率53% (14/26)
回答No.4

#1です。ちょっと比較・修正からはずれているのですがご容赦を。 これは私が常用している、ファイルのクリエータをあらかじめセットした一覧から選択して一括変更するスクリプトです。2行目が順にYooEdit、iCab、PictureViewer、SimpleTextのクリエータをセットしている行です。長いと思われるでしょうが、Macらしい挙動を求めるとこのくらいになってしまいます。 FinderPopを使われていますか?以下のスクリプトを「コンパイル済みスクリプト」で保存して、FinderPop項目フォルダーに入れると、Finderでファイルを複数選択後、そのままコンテクストメニューからスクリプトを実行できます。もちろん「アプリケーションで保存」でも大丈夫です。ドロップレットにするには先頭に「on open」、最終行に「end open」を挿入してからアプリケーションで保存します。 =====ここからコピー(この行は不要)===== set theFiles to {} set creatorList to {"YoED", "iCAB", "ogle", "ttxt"} tell application "Finder" repeat with aFIle in selection --セレクションの振り分けをする if (kind of aFIle ends with "画像") or (kind of aFIle ends with "書類") ツ or (kind of aFIle ends with "ファイル") or (kind of aFIle ends with "ピクチャ") then set end of theFiles to aFIle else display dialog name of aFIle & ツ "は処理できませんのでスキップします" buttons {"Skip"} default button 1 with icon stop giving up after 2 end if end repeat end tell if (count of theFiles) = 0 then display dialog "書類が選択されていませんので終了します" buttons {"Quit"} default button 1 with icon stop giving up after 2 return end if set aCreator to choose from list creatorList with prompt "Choose Creator" --クリエータ変換データの設定処理 tell application "Finder" try repeat with aFIle in theFiles --クリエータの変更処理 set creator type of aFIle to aCreator end repeat on error display dialog "作業をキャンセルしました" buttons {"OK"} default button 1 with icon note giving up after 2 (*リスト選択でキャンセルするとaCreatorにfalseがセットされる*) end try end tell =====ここまでコピー(この行は不要)===== ファイルのクリエータを調べるには、そのファイルを選択状態にして、以下のスクリプトをスクリプト編集プログラムから実行します。結果ウインドウにクリエータが表示されます。 =====ここからコピー(この行は不要)===== tell application "Finder" to get creator type of selection =====ここまでコピー(この行は不要)===== 同様にファイル名、修正日、作成日が得られるスクリプトです。 =====ここからコピー(この行は不要)===== tell application "Finder" to set theData to info for selection get {name, modification date, creation date} of theData =====ここまでコピー(この行は不要)===== 新しく質問を出してもらえれば目立つので、皆さんからレスがつきますよ。

rorirori
質問者

お礼

丁寧にありがとうございました。Macの情報はネットにもあまり落ちていないので、助かりました。

その他の回答 (3)

  • qntmphscs
  • ベストアンサー率53% (14/26)
回答No.3

#1です。 >open for accessでファイルを開き、Read、Writeで読み書きします。 ファイルI/Oできるんですね。以後、気をつけます。 MacJPerlでやるなら、新規ファイルに以下のスクリプトをペーストして、Dropletで保存して下さい。名前は適当につけて下さい。このドロップレットにテキストファイルを2つドロップすると差分ファイルDiffResult.txtが新規作成されます。 このスクリプトはとりあえず差分を抽出するというレベルです。最低限のエラー処理と動作確認はしてありますが、念のためダミーファイルで試して下さい。 重要:DiffResult.txtと同名のファイルがあると上書きされてしまいます。 =====ここからコピー(この行は不要)===== #!/usr/local/bin/perl $i=0; while($file = shift @ARGV){ open IN, "<$file" or die; $i++; if ($i==1){ $name1=$file; while(<IN>){ chomp($_); push @doc1,$_; } }elsif($i==2){ $name2=$file; while(<IN>){ chomp($_); push @doc2,$_; } } close IN; } open OUT, ">DiffResult.txt" or die; MacPerl::SetFileInfo("YoED", "TEXT", "DiffResult.txt"); $j=@doc1; $k=@doc2; $j=$k if $j<$k ; $m=0; for($i=1;$i<=$j;$i++){ $m++; $s=shift @doc1; $t=shift @doc2; if($s ne $t){ $line1=$name1."(".$m."): ".$s; $line2=$name2.": ".$t; print OUT $line1."\n".$line2."\n"; } } close OUT; MacPerl::Quit(2);

rorirori
質問者

お礼

ありがとうございます。使わせていただきます。

  • coriaka
  • ベストアンサー率72% (126/175)
回答No.2

単純なファイルの読み込み・書き込みだけならAppleScriptでもできます。 open for accessでファイルを開き、Read、Writeで読み書きします。 以下のURLに命令の書式が載っているので参考にしてください。 http://homepage1.nifty.com/ton_b/dic/OSAX/contents.html ただ、高度な操作を行うにはOSAXやアプリケーションの力を借りる方が楽でしょう。 テキストデータを扱うOSAXの1つにTanaka's OSAXがあります。 http://mtlab.ecn.fpu.ac.jp/tanaka_tool.html

rorirori
質問者

お礼

回答ありがとうございます。それからいいサイトを教えていただいてありがとうございました。お気に入りにいれて勉強します。

  • qntmphscs
  • ベストアンサー率53% (14/26)
回答No.1

■テキストファイルの内容を行単位で比較して、その差分をテキストファイルに出力したいのであれば、AppleScript単体ではできません。 JeditやQuoEditのような、テキストデータをAppleScriptで操作できるエディタが別途必要です。なお、アプリごとにAppleScriptの構文が違うので、その修得も必要です。 QuoEditはFinderと同様にレコーダブルですから、とりあえず試用してみてはいかがでしょう。 AppleScriptにこだわらないならMacJperlが最適です。テキスト処理ならこちらの方が速いし、楽です。 もし、テキストファイルに出力しなくてもよいなら、フリーウエアのDODO Diffで差分をチェックできます。 ■ファイルの属性(修正日やサイズ等)を比較・変更したいのならFinderに指示するだけなのでかんたんです。でもテキストファイルに出力するためにはやはりスクリプト対応のエディタ等が必要です。

rorirori
質問者

お礼

回答ありがとうございます。やはりAppleScriptではできないのですね。。自分でもいろいろ調べてみたのですが、情報がなくて困っていました。 ご指摘のとおりアプリを使うのは私にはちょっと困難そうですね。ここでまた質問するのはだめかもしれませんが、後学のため、最後に記載されているファイルの属性を比較するスクリプトをおしえていただけませんか?

関連するQ&A

  • Applescriptでファイルを開き、

    Applescriptでドラッグ&ドロップで複数のファイルを開き、文書内に特定の単語が使われているか調べ、使われているファイルのみカラーラベルをつけたいのですが、どう記述すればよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Mac
  • Applescriptでファイル名の一部を置換

    Applescript初心者です。 現在業務で使用しているアプリケーションを使用し、 pdfファイルの書き出し作業を行なっているのですが、 アプリの特性上ファイルネームの後ろに[1-1][2-2][3-3]といった ページ番号が必ず入ってしまいます。 (連結PDFではなく、単ページ出力の場合) Applescriptを使用し、ファイル後ろのページ番号を特定の文字に置き換えたいのですが ドロップレットなどで、そのような変換作業は可能でしょうか? 例/ サンプル[1-1].pdf    -->    サンプルP01.pdf サンプル[2-2].pdf     -->   サンプルP02.pdf サンプル[3-3].pdf     -->   サンプルP03.pdf 様々なホームページでApplescriptを使用したファイル名置換え方法を調べてみましたが ファイル全体のリネームができるscriptしか確認できませんでした。 また、Automatorを使用したファイル名置き換え方法もありますが、 置換えするページ数が多いため、テキスト登録を行うのに動作が重くなってしまいます。 (変換ページ数は[1-1]~[100-100]です。) 勉強不足で大変恐縮ですが、ご助力いただけると助かります。 ------------------------------------------------ 制作環境/Mac OS 10.7.4 ------------------------------------------------

    • ベストアンサー
    • Mac
  • ファイル比較を出力したい

    エディターなどで2つのファイルを比較し「見る」ことはできるのですが、そのファイルの比較結果を「差分」がわかる形でファイル出力またはプリントする方法のアドバイスをいただけないでしょうか。 #ファイルはテキスト形式のものを比較 #質問の場所はここでよいか不安ですが、きっといろいろ実務で使っていることではと想像してこちらでお聞きします。

  • windowsでテキストファイルの比較をファイル出力したい

    windowsでテキストファイルを比較するユーティリティーとして、windiffがありますが、画面表示しか出来ないと思います。 二つのテキストファイルを比較して、その結果(出来れば相違点のみ)を ファイル出力したいのですが、良いツールまたは、良い方法があれば教えて下さい。 宜しく、お願いします。

  • QuickTimeを自動再生させるAppleScript

    ファイルメーカーに埋め込んであるQuickTimeをページを 開いたら自動再生させたいのですが、 ファイルメーカーはAppleScriptをサポートしているので ファイルメーカーのスクリプトの「AppleScriptを実行」 にAppleScriptを記述すればできるみたいですが、その手 のことに疎いため、さっぱり分かりません。 分かる方宜しくお願いいたします。

    • ベストアンサー
    • Mac
  • applescriptでファイルをコピー

    様々な場所にあるファイルをapplescriptでフルパスを集めるところまでできました。 "/home/documents/xxxxx"_"/home/pic/yyyyy"_ のような形になっています。アンダーバーは半角スペース このコピーしたいファイルも10や20ならターミナルにそのままコピーペーストして cp "/home/documents/xxxxx"_"/home/pic/yyyyy"_ ~/test のようにすれば順番にコピーしてくれるのでいいのですが 数が多くなればターミナルが受け付けてくれなくなります。 分割してコピーペーストをしてもいいのですが、 なんとかこのコピーまでの処理をapplescriptでできないかなと思いまして質問をさせていただきました。 多いときには数百のファイルになるので、繰り返し処理だと不可がかかりすぎるのではないかと思いループは使っていません 同時にいくつものファイルを処理しそうで怖いのと、数が少ない状態で試しても分からないので。 あと1つのファイルのサイズは1M以下から大きくて15Mくらいです。 できるだけ負荷をかけないようにコピーする方法はありますか? applescript内で変数にこのフルパスが入っているので、automatorかapplescriptの処理だと助かります。 よろしくお願いします。

    • ベストアンサー
    • Mac
  • AppleScriptエラーで困っています!

    XcodeでAppleScriptを使用してプログラミングしています。 InterfaceBuilderでテキストフィールドを作りそこにテキストを入れるプログラムを以下のように記述しました。 set contents of text field "textfield" of window "main" to abc abcには既にテキストデータを入れています。 これを実行しようとすると A " can't go after this identifier. というエラーが出ます。 どこが間違っているのか全く分かりません。 どなたか詳しい方がいらっしゃればどうかアドバイスお願いします。

    • ベストアンサー
    • Mac
  • perl 複数ファイルから一行ずつ読み込んで比較

    初心者向けのperl参考書がなんとか理解できる程度のperl初心者です。 一週間ほど思考錯誤してきたのですが、いくらスクリプトを書いてもどうしても自分では解決できない処理がありましたので、初めてなのですが、質問させていただきました。 二つの同じ形式の、一部情報だけ異なるファイルから一行ずつ配列を読み込んで、数値の大小を比較したいのですが・・・ ファイル構造は、下のように2行でひとつのtextデータの情報を表示する形式となってまして、 奇数行には、各textファイルの情報が、.以下の部分に4552221.2:(30.2):100、のように記載されています。 偶数行には、各テキストファイルの、IDとなる情報が、13333331のように記載されています。この奇数行と、偶数行一行ずつで、ひとつのtextデータの 情報を表しています。textというファイルは、text1から順に,text2000000まで、 2000万程度,行で言えば4000万行ほど存在しています。よって、file1もfile2も、同じ行であれば、同じtextで、同じIDのものを示しています。ずれはありません。 file1 ----------------------------- >text1. 4552221.2:(30.2):100 13333331 >text2 87999999 >text3. 3444444.1:(20.0):300 75533333 ----------------------------- 数値は意味が変わらない範囲で、比較しやすい数値に変えてあります。 この上のfile1と、下のfile2を比べたいのですが、 file2 ----------------------------- >text1. 4552221.2:(20.9):100 13333331 >text2 87999999 >text3. 3444444.1:(23.3):300 75533333 ----------------------------- 偶数行のtextファイルの欄が大事で、text名のドット(.)の後に、続けて数値が書いてある場合(上ではtext1とtext3が該当)、そのドットの後の括弧()で囲まれた中の数値の大小を比較して、 差が一定以上あるtextだけを出力するスクリプトが書きたいと思っているのですが、 これをいきなりすべてひとつのスクリプトにまとめるのは、私の知識と力量では到底無理なので、ひとつひとつ段階を踏んで処理していこうと考えました。 1、奇数行の、text.の後半に情報があるもの場合、tempファイルにその奇数行と、対になる偶数行を出力する。それを、file1、file2、個別に行う。(temp1、temp2を出力) file1で取り除かれる3、4行目のtext2は、file2でも必ず取り除かれるので、1の処理後も、file1と2の各行は、比較することが可能な状態です。 2、正規表現を使って、各行の()で囲まれた部分の最初の2桁の数字(一部は一桁の数字の場合もあり)、をtempに出力する。(temp3、temp4を出力) (この処理を行わなくても可能かもしれませんが、ややこしいので、数字だけ出すようにしました) 最後に、file1とfile2の各行の数字を一行ずつ読み込んで、数値に一定以上の差がある行の情報だけ出力したいのですが、各行を順番に分析できる方法は、while文か、配列に読み込む方法しか知りません。 前者のwhile文では、ファイルオープンは、ひたつ以上は同時には取り扱えないという情報を得たので、使えない思っています。後者の配列に読み込む方法は、桁が大きいので、実用的ではないと感じています。 二つ以上のファイルの各行の特定の数値データを、一行ずつ順に比較して、差があるものだけ抽出するにはどのようなスクリプトを書けばよいのか、ご教授下さい。 いろいろ調べましたが、(僕の調べ方が悪いと思いますが)適切なコマンドや方法にたどり着けません。 試してみた方法 ファイルハンドルを二つ指定して、while文の条件中に、andで条件を二つ指定してファイルハンドルから読み込んでやればよいと思ったのですが、実行するとエラーになってしまいます。ググっていろいろ調べてみたところ、ファイルハンドルの二つ指定はできないとの記述を見つけたので、whileの条件に複数のファイルハンドルを記述するこの方法はあきらめて、ここで、ストップしています。 まわりに、perlを扱える方がいらっしゃれば質問に伺うのですが。もしよろしければ、簡単でもご教授いただけますと幸いです。宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • appleScript での保存(QuickTime Player のファイルについて)

    デジカメ動画を回転後、保存する方法を詳しく教えてください。(macです) 動画をappleScript を使って回転する方法はこちらのサイトを見て解ったんですが保存して閉じて再度開くととQuickTime Player のファイルは最初の状態に…??? 初心者でまったくわからないのですがappleScript で保存すると QuickTime Player では反映されないのですか?(appleScriptのファイルが出来ます) 動画を回転後ファイルを閉じなければ変更した画面を何度も見る事が出来ますが、ファイルを閉じても変更後の状態に保つ保存の方法が知りたいのでどなたか詳しくご指導ください。お願いします!

    • ベストアンサー
    • Mac
  • AppleScriptファイルの読み書きについて

    Applescriptを始めたばかりの初心者です。 テキストファイルを読み込んで、検索置換を行うスクリプトを作成してます。 検索置換まではなんとかできたのですが、ファイルを同じ場所に同じ名前で上書きしたいのですが、うまくいきません。見よう見まねで作成しているので、エラーがでても対処できませんでした。 どうかアドバイスをお願いします。 set thefile to "■■HD:0000:0000.txt"--いつも同じファイルを読み込む try set fn to open for access file thefile with write permission set mystr to read fn -- 全ての内容を得る end try display dialog mystr--内容の確認 set mystr to my replaceAll(mystr, "▼", return) display dialog mystr--内容の確認 write mystr to fn close access fn on replaceAll(motoStr, findStr, repStr) set OriginalDelimiters to AppleScript's text item delimiters set AppleScript's text item delimiters to {findStr} set motoStr to text items of motoStr set AppleScript's text item delimiters to {repStr} set motoStr to motoStr as string set AppleScript's text item delimiters to OriginalDelimiters return motoStr end replaceAll