📄 00000004.htm
字号:
int fd; <BR> off_t length; <BR> { <BR> return chsize (fd, length); <BR> } <BR> #endif <BR> #endif <BR> <BR>------------------------------ <BR> <BR>Subject: Why doesn't find's "{}" symbol do what I want? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>3.4) 为什麽执行 find 时所使用的 {} 符号无法达到我预期的结果? <BR> <BR> Find 指令有一个 -exec 的选项会针对每一个找到的档案执行一个特殊 <BR> 的指令。Find 会把出现{}的地方置换成目前找到的档案名称。因此, <BR> 也许有一天您会使用 find 指令对每一个档案执行某个指令,或者对 <BR> 一个目录执行某个指令。 <BR> <BR> find /path -type d -exec command {}/\* \; <BR> <BR> 希望 find 能依序执行以下指令: <BR> <BR> command directory1/* <BR> command directory2/* <BR> ... <BR> <BR> 不幸的是,find 只会展开自成一体的 {} token;如果 {} 跟其他字元相连 <BR> 的话(如:{}/*),那麽find将不会以您所想的方式展开 {}, 而是转换为以 <BR> 下命令 <BR> <BR> command {}/* <BR> command {}/* <BR> ... <BR> <BR> 也许您可以把它当成 bug, 也可以把它看成是故意设计的特异功能。但我们 <BR> 可不愿被目前这个特异功能干扰。所以要怎样避免这个问题呢?其中一种做 <BR> 法是写一个小小的 shell script,名称就叫做 ./doit 好了,其内容如下: <BR> <BR> command "$1"/* <BR> <BR> 那麽您就可以把原来的命令行改写为 <BR> <BR> find /path -type d -exec ./doit {} \; <BR> <BR> 如果您想省掉 ./doit 这个 shell script, 可以这麽写: <BR> <BR> find /path -type d -exec sh -c 'command $0/*' {} \; <BR> <BR> (这种写法可行的原因是 "sh -c 'command' A B C ..."指令当中,$0会展开为 <BR> A, $1会展开为B, 依此类推) <BR> <BR> 或者您也可以略施小计使用 sed 来造出您想执行的指令行: <BR> <BR> find /path -type d -print | sed 's:.*:command &/*:' | sh <BR> <BR> 如果您想减少 command 的执行次数,您可以先检查看看系统中有没有 <BR> xargs 这个指令, xargs会从标准输入一次读取一行,并且把这些读入的资料 <BR> 合并至一个命令行内。您可以写成以下命令行: <BR> <BR> find /path -print | xargs command <BR> <BR> 这样会使以下指令执行一次或多次: <BR> <BR> command file1 file2 file3 file4 dir1/file1 dir1/file2 <BR> <BR> 很不幸地,这并不是完美无缺或者万无一失的解法,输入 xargs 的文字行 <BR> 必须以换行字元结尾,所以当档案名称当中有奇怪的字元(如换行字元)时, <BR> xargs就会因此而混淆。 <BR> <BR>------------------------------ <BR> <BR>Subject: How do I set the permissions on a symbolic link? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>3.5) 我要如何改变一个 symbolic link 的 permission 呢? <BR> <BR> 这个问题没有意义,因为 symbolic link的 permission 根本不代表什麽。 <BR> 那个 link 所指过去的档案的 permission 才有意义。 <BR> <BR>------------------------------ <BR> <BR>Subject: How do I "undelete" a file? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>3.6) 我要如何 "undelete" 一个档案? <BR> <BR> 某年某月的某一天,要删除 "*.foo" 却一不小心打成了 "rm * .foo", <BR> 结果发现竟把 "*" 都删除了。真的是欲哭无泪啊!可是你也只好把这当成 <BR> 是成长的代价了。 <BR> <BR> 当然一个称职的系统管理员应当会定期做备份。先问一问你的系统管理员看 <BR> 你不小心删除的档案是不是有备份起来。如果没有的话,嗯,继续往下看吧! <BR> <BR> 不管你是不是真的要删除一个档案,当你下了 "rm" 以後,档案就不见了。 <BR> 在你 "rm" 一个档案,系统就不再记得你的档案是用了硬碟中的哪些 block <BR> 了。更糟糕的是,当系统要用到更多的硬碟空间时,就优先取用这些刚放出 <BR> 来的 block。不过天底下没有不可能的事。理论上说,若你在下了 "rm" 後, <BR> 马上把系统 shutdown,资料是就得回来的。不过,你得找一个对系统非常 <BR> 熟悉且肯花费数小时至数天的时间来帮你做这件事专家才行。 <BR> <BR> 当你不小心 "rm" 了一个档案後,第一个反应或许是为什麽不用一个 alias <BR> 或在 sh 中的 function 将 "rm" 取代掉,当你下 "rm" 只把档案搬到一个 <BR> 垃圾桶之类的地方呢?那如果不小心杀错档案就可以挽救,只是要定期清一 <BR> 清垃圾桶就好了。有两个理由。第一,大多数的人不认为这是一个好的做法。 <BR> 这麽做的话你会太依赖你的 "rm",有一天到了一个正常的系统中把正常的 <BR> "rm" 当成你的 "rm" 来用,那可能会死得很惨。第二,你会发现你花费了 <BR> 许多不必要的时间在处理垃圾桶里的东西。所以对一个初学者而言呢,用 <BR> "rm" 的 -i 选项应该就够了。 <BR> <BR> 如果你有大无畏的精神的话,那好吧,就给你个简单的答案。写一个名为 <BR> "can" 的指令,功用是将档案移到垃圾桶里。在 csh(1) 中,将以下的东西 <BR> 放进 ".login" 里: <BR> <BR> alias can 'mv \!* ~/.trashcan' # junk file(s) to trashcan <BR> alias mtcan 'rm -f ~/.trashcan/*' # irretrievably empty trash <BR> if ( ! -d ~/.trashcan ) mkdir ~/.trashcan # ensure trashcan exists <BR> <BR> 如果你想要每次 logout 时都把垃圾桶清乾净,那就把 <BR> <BR> rm -f ~/.trashcan/* <BR> <BR> 进 ".logout" 里。若你用的是 sh 或是 ksh,那自己试试著写写看吧! <BR> <BR> MIT 的雅典娜计画(Project Athena)作出了一套有 <BR> delete/undelete/expunge/purge 的软体。这套软体可以完全取代 "rm" 而又提 <BR> 供 undelete 的功能。这个软体曾 post 在 comp.sources.misc(volume 17, <BR> issue 023-025)。 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -