Subject: How do I rename "*.foo" to "*.bar", or change file names to lowercase? Date: Thu Mar 18 17:16:55 EST 1993
それぞれのシェルに依存しますが、ループを使って各ファイルごとに "mv" を 実行すれば、質問の動作を行なうことができます。使っているシステムに "basename" があるなら、このようにできます。
foreach f ( *.foo ) set base=`basename $f .foo` mv $f $base.bar end
for f in *.foo; do base=`basename $f .foo` mv $f $base.bar done
foreach f ( *.foo ) mv $f $f:r.bar end
for f in *.foo; do mv $f ${f%foo}bar done
ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | shこの作業をうまくやる、Vladimir Lanin の "mmv" というプログラムが comp.sources.unix(Volume 21, issues 87 and 88)に1990年4月に投稿されま した。
mmv '*.foo' '=1.bar'上のようなシェルループは、ファイル名を大文字から小文字、またはその逆の 変換に使うこともできます。もし大文字のファイル名から小文字のファイル名 に変えるなら、このようにすれば良いのです。
foreach f ( * ) mv $f `echo $f | tr '[A-Z]' '[a-z]'` end
for f in *; do mv $f `echo $f | tr '[A-Z]' '[a-z]'` done
typeset -l l for f in *; do l="$f" mv $f $l done
g=`expr "xxx$f" : 'xxx¥(.*¥)' | tr '[A-Z]' '[a-z]'`'expr' コマンドは、例え名前が '-n' とか、'¥c' の様な System V のエスケー プシーケンスを含んでいる時でさえ、常にファイル名として表示するでしょう。
"tr" のバージョンによって、[ や ] が必要なものとそうでないものがありま す。この上記の例にそれらを含ませるのは良くないかもしれせん。[] を要求 しないバージョンのtrは、'[' を '[' に(A-Z は a-z に)、']' は ']' に変 換すれば良いのだな、と都合良く考えるでしょう。
"perl" がインストールされていれば、Larry Wallのリネームスクリプトがと ても便利だと思うでしょう。これは広く様々なファイル名変更を行なうのに使 えます。
#!/usr/bin/perl # # rename script examples from lwall: # rename 's/¥.orig$//' *.orig # rename 'y/A-Z/a-z/ unless /^Make/' * # rename '$_ .= ".bad"' *.f # rename 'print "$_: "; s/foo/bar/ if <stdin> =‾ /^y/i' * $op = shift; for (@ARGV) { $was = $_; eval $op; die $@ if $@; rename($was,$_) unless $was eq $_; }