lsofはプレビューアプリで開いたすべてのファイルを表示しません


3

プレビューでは約43個のファイルが開かれていますが、実行するとlsof -c Preview、現在開かれているファイルの一部(8個のファイル)しか取得できません。

これは、アクティビティモニターを使用した場合と同じ出力ですが、開いたファイルの完全なリストを保存して、後でこのファイルのリストを再度開くことができるようにします。

このリンクで開かれている現在のファイルのリストを取得する方法に関するいくつかのヒントを見つけました。

誰が何が起こっているかのヒントを持っていますか?役立つ別の解決策は、最後のプレビューセクションで開かれたファイルのリストを取得することです。

編集:

DA Vincentがコメントしたように、ファイルはメモリにロードされた後に閉じられる可能性があります。プレビューによって開かれたファイルのウォッチャーを作成し、それらをファイルに記録することが可能な場合、これも適切なソリューションになります。特に、ユーザーのログインまたはOSの起動時にこのウォッチャースレッドを起動できる場合。


2
lsofで表示されるように、プレビューで開いているすべてのウィンドウに、開いているファイルが1つだけあると想定していますか?私は経験豊富なMac開発者ではありませんが、Preview.appがディスクからメモリにイメージファイル全体を読み取り、システムコールを発行できるのは自然なことです。特にプレビューが数十のファイルを表示していた場合。
DAヴィンセント

1
アプリケーションモニターとは何ですか?アクティビティモニターのことですか?
DAヴィンセント

1
@DAVincentすべてのファイルに対して1つのウィンドウが開いていますが、一部のウィンドウしか表示されていません。プレビューがファイルを閉じて画像をメモリに保持しているということですか?そのため、別のアプローチとして、プレビューアプリで開かれたファイルを監視し、ログに記録する方法があります。
ヴェルナー

1
@DAVincent、はい、アクティビティモニターを意味しました。
ヴェルナー

1
はい、@ Werner、あなたは私が何を得たかを理解しました。Preview.appを監視するスクリプトを作成できます。プレビューが速すぎてウォッチャーが気付かないような競合状態を回避するのは難しいかもしれません。しかし、他のコンピューターでの過去の経験から推測すると、スクリプトがシステムデバッグ機能を使用して、プレビューが行ったすべてのシステムコールをキャプチャできる可能性があります。
DAビンセント

回答:


3

これがapplescriptソリューションです。これにより、プレビューアプリで開いているファイルの完全なリスト(フルパスを含む)が表示されます。

また、AppleScriptの達人がこの答えに出くわした場合、あなたが提供しなければならない建設的な批判に感謝します。:)

set text item delimiters to "\n"
set myList to {}
tell application "Preview"
    set theDocs to get documents
    repeat with eachDoc in theDocs
        set thePath to path of eachDoc
        copy thePath to end of myList
    end repeat
end tell
set the_list to myList as text
tell application "Finder"
    set myFile to "/Users/YourName/YourFolder/FileName.txt"
    do shell script "date >> " & myFile
    do shell script "echo " & quoted form of the_list & " >> " & myFile
end tell

これにより、現在の日付と、プレビューで開いているすべてのドキュメントのリストが印刷されます。日付を省略したい場合は、次の行を削除します。

do shell script "date >> " & myFile

次の行に正しい情報を入力してください。

set myFile to "/Users/YourName/YourFolder/FileName.txt"

ファイル名に日付スタンプを追加する場合は、tell application "Finder"ブロックの下に次の行を追加します

set time_stamp to (do shell script "date \"+%m-%d-%y\"")
set myFile to "/Users/YourName/YourFolder/PreviewProfile_" & time_stamp & ".txt"

端末dateコマンドには、さまざまな形式があります。利用可能なさまざまなオプションについて読むには、ターミナルを開いてを入力しman strftimeます。

少し遊んだ後、このスクリプトをさらに簡略化できることに気付きました。これは、オリジナルからのいくつかの不必要な手順を回避する、より合理化されたバージョンです。しかし、結果はどちらの方法でも同じです。

set text item delimiters to "\n"
tell application "Preview"
    set theDocs to get path of every document as text
    tell application "Finder"
        set time_stamp to (do shell script "date \"+%m-%d-%y\"")
        set myFile to "/Users/YourName/YourFolder/PreviewProfile_" & time_stamp & ".txt"
        do shell script "echo " & quoted form of theDocs & " >> " & myFile
    end tell
end tell

使いやすくするために、このスクリプトをAutomatorサービスとして保存して、任意のアプリケーションでの作業中に使用できます。これを行うには、Automatorを開くだけです- [ファイル ]メニューから[ 新規 ]を選択するか、キーボードから⌘Nを選択します。次に、表示された選択肢からサービスを選択します。ドキュメントが開いたら、左端の列で[ ユーティリティ]を選択します。次に、その右側の列で「AppleScript実行」を選択します。表示されるボックスにこのスクリプトを貼り付けます。ページの上部にあるドロップダウンの選択肢で、[ サービスは入力受け取らず、どのアプリケーションでも]を選択します。その後、ファイルを選択して名前を付け、ファイルを保存すると、サービスメニューでいつでも使用できるサービスが必要になります。

更新

作成したファイルのリストを読み取って開く方法を次に示します。これにより、リスト内のすべてのファイルを開く必要がなくても、開くファイルを選択できます。

tell application "Finder"
    set file_list to {}
    set my_files to paragraphs of (read "/Users/YourName/path/to/YourFile")
    repeat with nextLine in my_files
        if length of nextLine is greater than 0 then
            copy nextLine to the end of file_list
        end if
    end repeat
    choose from list file_list with multiple selections allowed
    set chosen_Files to the result
    repeat with next_file in chosen_Files
        do shell script "open " & next_file
    end repeat
end tell

それが役に立てば幸い。問題があれば教えてください。


1
どうもありがとう、うまくいきました!このファイルをとして保存することは可能でしょうPreviewProfile-%date.txtか?
ヴェルナー

もちろんできます。更新された回答を確認してください。
I0_ol

1
私はこの答えに投票しました。lsofまたはプロセスレベルのデバッグ機能を使用して何かを作成しようとするよりも見栄えがよくなります。
DAヴィンセント

後でプレビューでファイルを開く方法を回答に追加すると役立つ場合がありますcat ~/PreviewEnvironments/PreviewProfile_05-15-17.txt | while read; do echo "$REPLY"; open $REPLY; done。これにより、スペースやその他の特殊文字が保持されます。私が行う別の編集は、「/ Users / YourName」を「〜」で変更することです。これにより、初心者がスクリプトを使用しやすくなります。
ヴェルナー

1
@Wernerリスト内のファイルを開くための私の更新を参照してください
-I0_ol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.