web-dev-qa-db-ja.com

ファインダーで選択したファイル/フォルダーを使用してシェルスクリプトを実行するにはどうすればよいですか?

私はLinuxから来ており、nautilusまたはdolphinの一連のファイルに対してスクリプトを実行するのは簡単ですが、OSXではこれが簡単ではないことに少し驚いていました。

できれば、Finderで選択範囲をCtrlキーを押しながらクリックし、スクリプトを選択して、進行状況やユーザーの操作を示すターミナルウィンドウをポップアップ表示できるようにしたいと思います。

13
Jeremy Cantrell

これを行う最も簡単な組み込みの方法は、項目をFinderからTerminalウィンドウにドラッグすることです。それらをドロップすると、Terminalはそれらの(エスケープされた)パス名を「入力」します。その後、シェルのコマンドライン編集を使用して、残りのコマンドを入力できます。または、先を考えている場合は、最初にコマンドを入力してから、アイテムをドラッグすることができます。

「ドラッグファースト」バージョン:

  1. 一部のFinder項目を選択して、シェルプロンプトが表示されているTerminalウィンドウにドラッグします。 ターミナルは(エスケープされた)パス名を挿入します。
  2. タイプ Control+A (行の先頭に移動します。⌃Aがデフォルトですが、シェル/構成によって異なります)。
  3. コマンドとスペースを入力します(パス名の前に挿入されます)。

「先を見据えた」バージョン:

  1. 任意の順序で、両方を実行します。
    • Terminalウィンドウで、コマンドの最初の部分とスペース(パス名を除くすべて)を入力します。
    • Finderでいくつかの項目を選択します。
  2. 選択したアイテムをFinderからコマンドを入力したTerminalウィンドウにドラッグします。
  3. ターミナルウィンドウをアクティブにして、を押します Return

より自動化されたソリューションが必要な場合は、(他の回答が示しているように)AppleScriptまたはAutomatorを利用できます。余分な「可動部品」によってソリューションが複雑になる可能性があるため、上記のプロセスの利点(手動ですが柔軟)と、1つ以上の自動化ソリューションの実装の複雑さを比較検討する必要があります。

自動化の可能性には、次のものがあります。

  • appleScriptドロップレットアプリケーション
  • 組み込みのスクリプトメニューまたはその他のランチャーによって起動される単純なAppleScriptプログラム
    • Finderの選択からパス名を取得します
  • automatorワークフロー、アプリケーション、またはFinderプラグイン
  • 実行可能ファイル.commandファイル(通常はシェルスクリプト。Finderで開いてターミナル)[.____で実行します。]
    • Finderの選択からパス名を取得します(osascriptを介して)
  • 必要な機能をすでに提供しているサードパーティツール
8
Chris Johnsen

これを直接行う方法はないと思います。求めていることの一部を実行する「Automator」アプリケーションを構築できます。これは、Automatorスタックがどのように見えるかを示しています。

enter image description here

結果をアプリケーションとして保存し、Finderでファイルを選択し、右クリックして[プログラムから開く]を選択し、アプリケーションを選択します。 (アプリケーションリストの下部にある[その他...]を選択する必要がある場合があります。)

この方法でスクリプトを操作することはできませんが、ファイルをループしてシェルスクリプトを実行できます。

7
Peter Murray

Servicesは、 osx がこの種のことを処理する方法です。

アプリケーションメニュー(この場合は「ファインダー」)の下には、(ほとんど)常にServicesメニューオプションがあり、現在のアプリケーションおよびに適用されるサービスを提供します。その現在の状態。通常、状態は、選択されているオブジェクトのタイプ(テキスト、ファイル/フォルダーなど)です。

これらは、システム環境設定パネルで有効、無効、および割り当て可能なキーボードショートカットであり、これら3つのうち最後のKeyboardにのみ意味があります。

keyboard shortcuts

Finderのファイル/フォルダーにシェルスクリプトを適用するサービスを作成するには:

automator を起動し、新しいServiceタイプのドキュメントを作成します。

New Service

  • サービスが適用されるオブジェクトのタイプを設定します(files or folders
  • サービスを利用できるアプリケーションを設定します( Finder
    • または、Get Selected Finder Itemsアクションがあります。
  • Run Shell Scriptのアクションを追加します
  • 入力を引数として使用するか、 stdin にするかを決定します

次のようになります。

example Shell script

automator 保存すると、自動的に~/Library/Servicesフォルダーに配置され、Application -> Servicesメニューまたはコンテキスト(右クリック)メニューからすぐに(ほぼ)使用できるようになります。

test folders

resulting TextEdit document

5
Lake

上記の答えに基づいて、私はこれを構築しました

https://github.com/commonpike/DropShell

基本的に、ドロップされたファイルを引数としてアプリ内にあるシェルファイルを呼び出すapplescriptアプリ。必要に応じてシェルスクリプトを変更できます。

2
commonpike

Commonpikeの回答に基づいて、ドロップされたすべてのファイルを一致する名前のシェルスクリプトにリダイレクトするAppleScriptを作成しました。 AppleのScriptEditor内からアプリケーションとして保存し、script.shに一致するようにscript.appに名前を変更するだけです https://github.com/PHolker/scripts/blob/master/DropScript.scpt

2
PHolker

私もそれをやりたいと思っていましたが、上記のソリューションとは異なり、シェルスクリプトの引用符で囲まれたパラメーターを作成したいと思いました。これらの他の方法は問題ありませんが、本当に必要なのがpbpasteである場合に、「コマンドキーを押してターミナルに移動する」ことを提案するようなものです。

Finderの選択ごとにファイルパラメータに展開されるスクリプトで使用できるシェル関数を作成したかったのです。私は魚のシェルを使用していますが、これはある程度機能しているようです。

_function selection
    osascript -e "tell application \"Finder\" to set s to the selection as alias list" -e "repeat with f in s" -e "set contents of f to POSIX path of f" -e "end repeat" -e "set AppleScript's text item delimiters to linefeed" -e "s as string"
end
_

convert-video (selection)のように(再びfish Shellで)使用されます。

Bash関数では、そのosascriptコマンドの最後で、出力を_| tr '\n' '\0' | xargs -0 printf "%q" {}_のようなもので引用する必要があるかもしれませんが、確かではありません。

(注:過去2時間に再学習した、高度なAppleScriptとシェルスクリプトについて知っていることはすべて、明日までに忘れてしまいます)

1
Pierre Houston

Mac OS Xでは、推奨されるスクリプト言語はApplescriptです。ドロップレット(いくつかのファイルをアイコンにドロップすると何かを実行するスクリプト)を作成し、スクリプト(アプリケーションとして保存できる)アイコンをデスクトップに配置して、渡すファイルをドラッグアンドドロップして脚本。

別の方法として、フォルダアクションを使用できます。スクリプトApplescriptをフォルダに関連付けることができます。このフォルダは、一部のファイル(またはディレクトリ)がフォルダにドロップされるたびに実行されます。

1
kiamlaluno

FastScripts (私が強くお勧めします)を発見して以来、私はそれにオールインしてAutomatorを排除する方法を探していました。そのため、選択したFinderアイテムをパラメーターとしてシェルに渡す方法が必要でした。

そのために、ApplescriptライブラリHandlers.scpt~/Library/Script Librariesにハンドラーを作成しました。このハンドラーは、渡されたブール値に応じて、選択をPOSIXまたはHFSパスとして返します。

on getselection(hfs)
    set text item delimiters to linefeed
    tell application "Finder" to set sel to text items of (selection as text)
    if hfs then return sel
    repeat with i in sel
        set contents of i to POSIX path of i
    end repeat
    return sel as text
end getselection

Bashスクリプトから、ハンドラーの結果を配列に読み取ります。 POSIXパスが必要なため、falseを渡します。配列の最初の要素が空になると、スクリプトは終了します。

#!/usr/local/bin/bash
mapfile -t i < <(osascript -e 'tell script "Handlers" to getselection(false)')
[[ $i ]] || exit 0

whatever-command "${i[@]}"
0
Daan