Next: Transforming File Names, Previous: Operating on Files, Up: Dired [Contents][Index]
Diredコマンド!
(dired-do-shell-command
)は、ミニバッファーでシェルのコマンド文字列を読み取り、そのシェルコマンドを1つ以上のファイルにたいして実行します。シェルコマンドが処理するファイルは、Diredコマンドが操作するファイルを決定する方法と同じです(Operating on Filesを参照してください)。コマンドXは、!の別名です。
コマンド&
(dired-do-async-shell-command
)は同じことを行ないますが、これはシェルコマンドを非同期で実行する点が異なります(!でシェルコマンドの最後に文字‘&’を追加しても、同じことを行なうことができます)。コマンドが複数のファイルを処理する場合、ファイルごとに指定したシェルコマンドの複数コピーを並行で実行します。例外として、指定されたシェルコマンドが‘;’または‘;&’で終わる場合、バックグラウンドで実行されるシェルコマンドは、各ファイルにたいして順番に実行されます。Emacsは次のコマンドを実行する前に、呼び出したシェルコマンドが終了するのを待ちます。
!と&のどちらも、シェルコマンドの作業ディレクトリーは、Diredバッファーのトップレベルのディレクトリーです。
!または&に複数ファイルを処理させる場合、シェルコマンド文字列は、シェルコマンドにそれらのファイルを渡す方法を決定します。
したがって! tar cf foo.tar *
RETは、ファイル名全体のリストにたいしてtar
を実行し、それらをtarファイルfoo.tarに格納します。
空白文字で囲まれたシェルのワイルドカードとして‘*’を使用したい場合は、‘*""’と記述します。シェルではこれは‘*’と等価です。しかし‘*’が空白文字で囲まれていないので、Diredはこれを特別に扱うことができるのです。
uudecode
を実行します。
もっと複雑な方法でファイル名を繰り返すには、明示的なシェルループを使用したいと思うかもしれません。たとえば以下は、各ファイルをuuencodeして、入力ファイル名に‘.uu’を追加して出力ファイル名を作成する例です:
for file in * ; do uuencode "$file" "$file" >"$file".uu; done
以下は、‘`?`’表記による同じ例です:
uuencode ? ? > `?`.uu
コマンド!および&は、新しいファイル、または変更されたファイルを表示するために、Diredバッファーを更新しようとはしません。なぜならこれらのコマンドは、どのファイルが変更されたかを知らないからです。Diredバッファーを更新するには、gを使用します(Dired Updatingを参照してください)。
Diredの外でシェルコマンドを実行する情報に関しては、Single Shellを参照してください。