diredコマンドの!(dired-do-shell-command
)は、
ミニバッファからシェルコマンドを読み取り、
指定したファイルすべてについてそのシェルコマンドを実行します。
diredコマンドの普通の方法で操作対象のファイルを指定できます
(see Operating on Files)。
複数ファイルにシェルコマンドを適用する方法は2通りあります。
したがって、! tar cf foo.tar * <RET>はtar
を実行し、
指定した一連のファイルをfoo.tarというtarファイルにまとめる。
たとえば、! uudecode <RET>は、
各ファイルに対してuudecode
コマンドを実行する。
各ファイルごとにコマンドを1回実行したいが、
コマンドの最後ではなく途中にファイル名を指定したい場合にはどうするのでしょう?
あるいは、もっと複雑にファイル名を指定したい場合にはどうするのでしょう?
それにはシェルのループを使います。
下の例では、指定した各ファイルに対してuuencode
を実行しますが、
その出力は対応する.uuというファイルに格納します。
for file in *; do uuencode $file $file >$file.uu; done
シェルコマンドの作業ディレクトリは、 diredバッファのトップディレクトリです。
!コマンドは、実行後に新たにできたファイルや変更された ファイルを表示するためにdiredバッファを更新することはしません。 これはシェルコマンドを実際には理解しておらず、 シェルコマンドがどのファイルを変更するのかわからないからです。 diredバッファを更新するにはgコマンドを使います (see Dired Updating)。