Diredコマンド ! (dired-do-shell-command)
は、ミニバッファ内のシェルコマンド文字列を読み込み、そのシェルコマンドを1つ以上のファイルに対して実行します。シェルコマンドが対象となるファイルは、Diredコマンドにおける通常の方法で決定されます(ファイルの操作を参照)。コマンド X は ! の別名です。
コマンド & (dired-do-async-shell-command)
も同様の動作をしますが、シェルコマンドを非同期に実行します。(また、シェルコマンドの末尾に ‘&’ 文字を付加することで、!
でも同様の処理が可能です。)コマンドが複数のファイルを対象とする場合、指定されたシェルコマンドのコピーをファイルごとに1つずつ、複数並列に実行します。例外として、指定されたシェルコマンドが
‘;’ または ‘;&’
で終わる場合、シェルコマンドは各ファイルに対して順次バックグラウンドで実行され、Emacs
は呼び出された各シェルコマンドが終了するのを待ってから次のコマンドを実行します。
! と & のいずれにおいても、シェルコマンドの作業ディレクトリは Dired バッファの最上位ディレクトリとなります。
! または & に複数のファイルを操作するよう指示した場合、シェルコマンド文字列によって、それらのファイルがどのようにシェルコマンドに渡されるかが決まります:
したがって、! tar cf foo.tar * RETはファイル名のリスト全体に対してtarを実行し、それらを1つのtarファイルfoo.tarにまとめます。
‘*’
を空白を挟んだシェルのワイルドカードとして使用したい場合は、‘*""’ と記述してください。シェル内ではこれは ‘*’ と同等ですが、‘*’ は空白で囲まれていないため、Dired はこれを特別に扱いません。dired-confirm-shell-command が nil でない限り、このように記述すると Emacs は確認を求めます。
uudecode を実行します。
ファイル名をより複雑な方法で処理したい場合は、明示的なシェルループを使用するのがよいでしょう。例えば、各ファイルをuuencodeし、入力ファイル名に‘.uu’を付加して出力ファイル名を作成する方法を以下に示します。
for file in * ; do uuencode "$file" "$file" >"$file".uu; done
‘`?`’表記を用いた同様の例:
uuencode ? ? > `?`.uu
! および & コマンドは、どのファイルが変更されるか不明なため、新規または変更されたファイルを表示するように Dired バッファを更新しようとはしません。Dired バッファを更新するには g コマンドを使用してください(Dired バッファの更新 を参照)。
Dired外でシェルコマンドを実行する方法については、シングルシェルコマンドを参照してください。