私はLinuxから来ており、nautilusまたはdolphinの一連のファイルに対してスクリプトを実行するのは簡単ですが、OSXではこれが簡単ではないことに少し驚いていました。
できれば、Finderで選択範囲をCtrlキーを押しながらクリックし、スクリプトを選択して、進行状況やユーザーの操作を示すターミナルウィンドウをポップアップ表示できるようにしたいと思います。
これを行う最も簡単な組み込みの方法は、項目をFinderからTerminalウィンドウにドラッグすることです。それらをドロップすると、Terminalはそれらの(エスケープされた)パス名を「入力」します。その後、シェルのコマンドライン編集を使用して、残りのコマンドを入力できます。または、先を考えている場合は、最初にコマンドを入力してから、アイテムをドラッグすることができます。
「ドラッグファースト」バージョン:
「先を見据えた」バージョン:
より自動化されたソリューションが必要な場合は、(他の回答が示しているように)AppleScriptまたはAutomatorを利用できます。余分な「可動部品」によってソリューションが複雑になる可能性があるため、上記のプロセスの利点(手動ですが柔軟)と、1つ以上の自動化ソリューションの実装の複雑さを比較検討する必要があります。
自動化の可能性には、次のものがあります。
.command
ファイル(通常はシェルスクリプト。Finderで開いてターミナル)[.____で実行します。]これを直接行う方法はないと思います。求めていることの一部を実行する「Automator」アプリケーションを構築できます。これは、Automatorスタックがどのように見えるかを示しています。
結果をアプリケーションとして保存し、Finderでファイルを選択し、右クリックして[プログラムから開く]を選択し、アプリケーションを選択します。 (アプリケーションリストの下部にある[その他...]を選択する必要がある場合があります。)
この方法でスクリプトを操作することはできませんが、ファイルをループしてシェルスクリプトを実行できます。
Servicesは、 osx がこの種のことを処理する方法です。
アプリケーションメニュー(この場合は「ファインダー」)の下には、(ほとんど)常にServices
メニューオプションがあり、現在のアプリケーションおよびに適用されるサービスを提供します。その現在の状態。通常、状態は、選択されているオブジェクトのタイプ(テキスト、ファイル/フォルダーなど)です。
これらは、システム環境設定パネルで有効、無効、および割り当て可能なキーボードショートカットであり、これら3つのうち最後のKeyboard
にのみ意味があります。
Finderのファイル/フォルダーにシェルスクリプトを適用するサービスを作成するには:
automator を起動し、新しいService
タイプのドキュメントを作成します。
files or folders
)Get Selected Finder Items
アクションがあります。Run Shell Script
のアクションを追加します次のようになります。
automator 保存すると、自動的に~/Library/Services
フォルダーに配置され、Application -> Services
メニューまたはコンテキスト(右クリック)メニューからすぐに(ほぼ)使用できるようになります。
上記の答えに基づいて、私はこれを構築しました
https://github.com/commonpike/DropShell
基本的に、ドロップされたファイルを引数としてアプリ内にあるシェルファイルを呼び出すapplescriptアプリ。必要に応じてシェルスクリプトを変更できます。
Commonpikeの回答に基づいて、ドロップされたすべてのファイルを一致する名前のシェルスクリプトにリダイレクトするAppleScriptを作成しました。 AppleのScriptEditor内からアプリケーションとして保存し、script.shに一致するようにscript.appに名前を変更するだけです https://github.com/PHolker/scripts/blob/master/DropScript.scpt
私もそれをやりたいと思っていましたが、上記のソリューションとは異なり、シェルスクリプトの引用符で囲まれたパラメーターを作成したいと思いました。これらの他の方法は問題ありませんが、本当に必要なのが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とシェルスクリプトについて知っていることはすべて、明日までに忘れてしまいます)
Mac OS Xでは、推奨されるスクリプト言語はApplescriptです。ドロップレット(いくつかのファイルをアイコンにドロップすると何かを実行するスクリプト)を作成し、スクリプト(アプリケーションとして保存できる)アイコンをデスクトップに配置して、渡すファイルをドラッグアンドドロップして脚本。
別の方法として、フォルダアクションを使用できます。スクリプトApplescriptをフォルダに関連付けることができます。このフォルダは、一部のファイル(またはディレクトリ)がフォルダにドロップされるたびに実行されます。
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[@]}"