📄 00000003.htm
字号:
<BR> foreach f ( *.foo ) <BR> mv $f $f:r.bar <BR> end <BR> <BR> Korn Shell: <BR> <BR> for f in *.foo; do <BR> mv $f ${f%foo}bar <BR> done <BR> <BR> 如果没有 "basename" 可用或是想要做像把 foo.* 改名为 bar.* 之类的 <BR> 事,那麽可以用其他的方法如 "sed" 把原来的档案名称做分隔的动作,但 <BR> 是回圈的想法是一样的。你也可以利用 "sed" 把档名转换成 "mv" 的命令 <BR> ,然後再把这些命令转给 "sh" 执行。如下: <BR> <BR> ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh <BR> <BR> 在 1990 年 4 月时,Vladimir Lanin 把他自己写的一个叫 "mmv" 的程式 <BR> post 到 comp.sources.unix (Volumn 21, issues 87 and 88),这个程式 <BR> 就能够把这件事处理得很好。 你可以这样使用: <BR> <BR> mmv '*.foo' '=1.bar' <BR> <BR> 以上所提的 shell 中的回圈也可以用来做档案名称的大、小写转换。你可 <BR> 以用改档名的方式把大写档名改为小写: <BR> <BR> C Shell: <BR> foreach f ( * ) <BR> mv $f `echo $f | tr '[A-Z]' '[a-z]'` <BR> end <BR> <BR> Bourne Shell: <BR> for f in *; do <BR> mv $f `echo $f | tr '[A-Z]' '[a-z]'` <BR> done <BR> <BR> Korn Shell: <BR> typeset -l l <BR> for f in *; do <BR> l="$f" <BR> mv $f $l <BR> done <BR> <BR> 如果你还希望能处理含有特殊字元(空白或其他的奇怪字元)的档名,那 <BR> 麽你最好用: <BR> <BR> Bourne Shell: <BR> <BR> for f in *; do <BR> g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'` <BR> mv "$f" "$g" <BR> done <BR> <BR> 'expr' 不管档名里有没有特殊字元都会印出档名。 <BR> <BR> 有些版本的 "tr" 需要用 '[' 和 ']',有些则不必。不过,不管是不是一 <BR> 定要用 '[' 与 ']' 的 "tr",加了总是没有害处。 <BR> <BR> 若你的系统里有装 "perl",那你可以用 Larry Wall 写的这个多用途改档 <BR> 名的程式。 <BR> <BR> #!/usr/bin/perl <BR> # <BR> # rename script examples from lwall: <BR> # rename 's/\.orig$//' *.orig <BR> # rename 'y/A-Z/a-z/ unless /^Make/' * <BR> # rename '$_ .= ".bad"' *.f <BR> # rename 'print "$_: "; s/foo/bar/ if <stdin> =~ /^y/I' * <BR> <BR> $op = shift; <BR> for (@ARGV) { <BR> $was = $_; <BR> eval $op; <BR> die $@ if $@; <BR> rename($was,$_) unless $was eq $_; <BR> } <BR> <BR>------------------------------ <BR> <BR>Subject: Why do I get [some strange error message] when I "rsh host <BR>command" ? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>2.7) 为什麽我用 "rsh host command" 会有一些奇怪的讯息出现? <BR> <BR> (这里所指的 "rsh"[也可能是 "remsh" 或 "remote"] 是 remote shell, <BR> 而不是在有些系统中名为 "rsh" 的 restricted shell,这两者天差地远 <BR> 了!) <BR> <BR> 若你在远端的帐号用的是 C shell,那远端的主机会帮你启动一个 C <BR> shell 来完成你所下的那个 'command',这个 shell 会读取你在远端的 <BR> .cshrc 档。若你的 .cshrc 中有 "stty" 或 "biff" 这类不适合 non- <BR> interactive shell 的指令。那就可能会有你所意想不到的结果,举例来 <BR> 说,若你把 <BR> <BR> stty erase ^H <BR> biff y <BR> <BR> 放在你的 .cshrc 档里面。你可能会得到类似以下的奇怪讯息 <BR> <BR> % rsh some-machine date <BR> stty: : Can't assign requested address <BR> Where are you? <BR> Tue Oct 1 09:24:45 EST 1991 <BR> <BR> 若你使用 "at" 或 "cron",那可能也会得到类似的错误讯息。 <BR> <BR> 不过没关系,解决的方法非常简单。若你的 ".cshrc" 里面有一堆只有在 <BR> interactive shell 中才有用的 operation,那就将那些 operation 都用 <BR> 以下的做法包起来: <BR> <BR> if ( $?prompt ) then <BR> operations.... <BR> endif <BR> <BR> 因为在一个 non-interactive 中不应该也没有必要去设定 "prompt"。 <BR> <BR> 还有一些只有在开启一个 login session时才有用的东西,最好搬到 <BR> ".login" 中去。 <BR> <BR>------------------------------ <BR> <BR>Subject: How do I ... and have that change affect my current shell? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>2.8) 我要怎要用程式或者是 shell script 中设定目前所用的 shell 的环境 <BR> 变数或改变所在的目录? <BR> <BR> 若没有做一些特殊安排是做不到的。因为,当我们造出一 child process <BR> 时,此 process 会继承其 parent 的变数与所在的目录。在这个 child <BR> process 只能改到自己的变数与所在目录而无法影响到其 parent。 <BR> <BR> 要达到此目的,parent process 要与 child process 有所沟通。当 <BR> child process 要改变变数值时得把要改变的变数及其内容写到一个讲好 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -