命令行执行java程序_命令行执行

每当您旅行到一个居民说不同寻常的母语的国家时,您都可能会用一些基本的生存短语武装自己,例如“这要花多少钱?”,“这是哪种肉?”和“哪里在洗手间吗?” 记住这些小技巧可以确保您不会因订购的那条蛇三明治而被多收,而且您知道大自然母亲(或蛇三明治)打来电话时该去哪里。

UNIX®也拥有自己的方言,并且在过去的六个月中,该口语UNIX系列在命令行执行方面提供了一些速成课程。 本月,学习一些有用的短语,让您立即与当地人融合。 拿起牙刷,收拾一些舒适的鞋子,并更新接种疫苗。 您想去晒太阳,沙子和贝壳。 (对于阳光和沙滩,请sc起笔记本电脑,前往海滩,在水边附近俯冲,然后阅读本专栏。不要忘了防晒霜。)

参加徒步之旅

以前的许多UNIX口语专栏(请参阅参考资料 )都提供了find命令-一个非常有用的实用程序,用于扫描和处理文件甚至整个UNIX文件系统。 例如,我经常将findgrep或Perl结合使用来处理大量文件。 是否想知道在大量代码中哪里定义了变量或常量? 试试这个:

$ find /path/to/src  -type f | xargs grep -H -I -i -n string

命令的输出是包含string的文件名的列表,其中包括行号和匹配的特定文本。 -H-n选项分别在每个匹配项的开头加上每个匹配项的文件名和行号。 -i选项忽略大小写。 -I (大写的“ I”)跳过二进制文件。

如果您以前从未见过xargs ,它将为您指定的命令(通过所有列出的选项使用grep (通过标准输入提供的每个参数)运行一次。 假设/ path / to / src目录包含文件a,b和c,将findxargs结合使用等效于:

grep -H -I -i -n string a
grep -H -I -i -n string b
grep -H -I -i -n string c

实际上,搜索文件集合非常普遍,因此grep拥有自己的选项来递归文件系统层次结构。 使用-d recurse或其同义词-R-r 。 例如,使用:

$ grep -H -I -i -n -R string/path/to/src

该命令实现与find/xargs相同的功能。 (您会发现许多与文件相关的UNIX实用程序都有递归选项ls -R递归列出层次结构的内容chmodchgrpchown使用-R将模式,组和所有权更改应用于整个文件系统层次结构。请小心使用chmod -R 。如果删除目录的执行位,可能会无意中使该目录不可用,例如使用chmod -R ax 。要想更具选择性,请尝试find . -type f | xargs chmod ax 。)

那么,什么时候应该使用find / xargs ,什么时候应该使用grep ? 需要选择时,请使用findfind命令具有许多条件,允许您选择满足特定要求的文件,例如概念上的“午夜之后修改并由Joe拥有的所有常规文件”。 否则, grep -R就足够了。

find相比,另一个实用程序可以更方便快捷地使用。 如果find -name名称查找文件,请尝试使用locate而不是find -namelocate命令会定期(一天左右一次,由系统管理员调整)对系统上的每个文件进行分类,并建立一个包含路径和文件名的数据库。 当您运行locate ,它会扫描其私有数据库,尝试进行匹配。

例如,运行查询locate '*.1'产生名称以.1结尾的所有文件和目录。 (星号开头表示匹配任何内容 。)为了方便起见,运行locate fish命令与locate '*fish*'

货币兑换

许多UNIX实用程序都会修改文件。 在大多数情况下,更改后的内容会发送到标准输出,您可以在其中使用重定向运算符进行进一步处理(使用管道-|)或捕获结果(使用>>>运算符)。

其他实用程序(通常可以一次处理多个文件的实用程序)可以保留原始文件以进行保管,并为更改后的内容生成一个新文件。 例如,您可以直接从命令行使用Perl来处理文件。 命令:

$ perl -i.bak -pe 's/\bdollar(s?)/buck\1/g' file.txt

用“ buck”替换“ dollar”,用“ bucks”替换“ dollars”。 perl -i命令就地更改file.txt; perl -i.bak复制原始文件,并附加.bak使其与新的修改版本区分开。 因此,命令如下:

perl -i.bak -pe 's/\bdollar(s?)/buck\1/g' *

将为当前目录中的每个文件创建一个备份。 假设您有文件file1.txt,file2.txt和file3.txt,那么您将拥有file1.txt.bak,file2.txt.bak和file3.txt.bak。 发生错误,因此进行备份很明智。

如果您出错了并且必须恢复原件,则可以简单地键入:

mv file1.txt.bak file1.txt

但是,如果您要重命名数百个文件 ,该怎么办? 当然,您不想键入数百个单独的mv命令。 相反,您可以输入以下内容:

foreach file in (*.txt)
do
  mv $file.bak $file
done

在像这样的简单情况下,它确实可以很好地工作。 但是,此类任务非常普遍,以至于使用特殊的实用程序可以使工作更快。 命令:

$ rename 's/\.bak$//' *.bak

执行相同的任务。 正则表达式s/\.bak$// 。bak s/\.bak$//从命令行上列出的每个文件名(此处为*或每个文件)中删除.bak ,并将缩写名称用作目标文件名。

当文件名特别不规则时, rename命令特别有效。 例如,考虑该目录的内容,它看起来像是大学新生的一封信。

$ ls 
RenT.txt  bEErMoNey.txt  gASmoNey.TXt

上面显示的foreach脚本无法解决此问题,因为文件名太不规则了。 然而, rename可以通过一些按键来处理:

$ rename 'y/A-Z/a-z/' *

正则表达式y/AZ/az/y运算符用于翻译 。 翻译需要两个列表:原始字符列表和替换字符列表。 如果两个列表的大小相同,则将文本中原始列表的第一个字符的每个实例替换为替换列表的第一个字母。 换句话说,在该示例中,大写字母“ A”的每个实例都用小写字母“ a”替换,“ B”用“ b”替换,依此类推。 文本中的小写字母保持不变。

如果要预览rename作用,请添加-n选项。 此选项显示命令的操作而不进行实际更改:

$ rename -n 'y/A-Z/a-z/' *
RenT.txt renamed as rent.txt
bEErMoNey.txt renamed as beermoney.txt
gASmoNey.TXt renamed as gasmoney.txt
$ rename 'y/A-Z/a-z/' *
$ ls
beermoney.txt  gasmoney.txt  rent.txt

要避免的一个陷阱:在UNIX系统上,文件名区分大小写。 目录可以包含Aa.Txt和aA.txT。 如上所示,有可能编写一个重命名规则,该规则会将区分大小写的文件转换为小写文件名,从而导致以前唯一的文件名之间发生冲突。 在这种情况下, rename有什么作用? 让我们来看看:

$ rename -n 'y/A-Z/a-z/' * 
Aa.Txt renamed as aa.txt
aA.txT renamed as aa.txt
$ rename 'y/A-Z/a-z/' *
aA.txT not renamed: aa.txt already exists
$ ls
aA.txT  aa.txt

如果要在重命名过程中“整理”现有文件,请添加-f标志。 在此示例中,结果将是一个名为aa.txt的文件。 那原来是哪个文件? 因为rename按字母顺序工作,所以后者的文件aA.txT现在是aa.txt。 为什么使用-f ? 如果两个文件与名称相同,则rename -f将删除重复的文件。

现在不是时候了

文件管理无疑是使用UNIX的很大一部分。 系统具有无数个配置文件。 您可能有过多的数据文件和个人文件。 您可能会不时地删除或覆盖有价值的文件。 外壳程序和几个文件管理实用程序可以帮助您避免灾难。

在shell提示符下键入以下命令。 这些命令可在bash ,但zsh和其他Shell中也存在类似的选项。

$ alias mv=mv -i
$ alias rm=rm -i
$ set -o noclobber

前两个命令在命令行上分别用mv -irmrm -i替换mv 。 交互模式迫使您确认操作。

第三个命令在外壳本身中提供了一点安全性。 在启用noclobber情况下,您不能使用>重定向运算符意外覆盖文件:

$ ls
secret.txt
$ cat > secret.txt
bash: secret.txt: cannot overwrite existing file

要禁用noclobber ,请输入:

set +o noclobber

您也可以随时使用>|强制覆盖。 (大于符号,后接竖线)重定向操作符。

$ cat secret.txt
I love green eggs and ham. 
$ echo "No more secrets" >| secret.txt
$ cat secret.txt
No more secrets

当地人的秘密

如果您真的想发现一座城市,则必须参观当地的水坑。 这是值得Zagat使用的命令行组合的集合。

mkdir -p可以快速进行层次结构创建。 使用-pmkdir创建在命名路径中找到的每个目录和子目录:

$ mkdir -p make/many/directories/at/once
$ ls -R 
./make:
many

./make/many:
directories

./make/many/directories:
at

./make/many/directories/at:
once

./make/many/directories/at/once:

如果您需要知道下一个发薪日是何时,只需键入cal 。 不带任何参数的cal输出当前月份的日历。 cal -3命令显示前一个,当前和下个月,而cal 06 2009显示您2009 cal 06 2009 6月。(我的生日在当年的星期一!)

$ cal

   November 2006    
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
$ cal 06 2009

     June 2009      
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

因为UNIX有太多命令,所以几乎不可能记住所有实用程序的所有选项。 确实,有时您甚至不记得该实用程序的名称。

陷入困境时,转向man 。 例如,键入man man ,以了解如何使用man本身。 您还可以使用man rmman mv查看rmmv说明。 而且,如果您知道要查找的主题,则可以使用make -k查找与该主题相关的手册页列表。

$ man -k cron
cron (8)             - daemon to execute scheduled commands (Vixie Cron)
crontab (1)          - maintain crontab files for individual users (V3)
crontab (5)          - tables for driving cron
dh_installcron (1)   - install cron scripts into etc/cron.*

在这里, man发现了这些实用程序的手册页,这些实用程序的单行描述包含单词cron 。 这些手册页可能会解释如何使用cron (系统作业计划守护程序)。

少量的数字是做什么的? 每个数字均指联机UNIX手册的一部分。 第1节保留给UNIX用户可以在Shell中运行的所有命令。 第5节介绍文件格式。 第8节对系统管理命令进行了分类。 其他部分介绍系统调用(2),库调用(3)等。

如您所见,大多数命令都发出一种或另一种输出。 大多数命令行命令将标准输出用于结果。 但是其他人则使用标准输出和标准错误按顺序显示进度和错误消息。 如果您想忽略这种输出(这很有用,因为它通常会干扰在命令行上的工作),则可以将输出重定向到UNIX 位存储区 / dev / null。 位签入,但不签出。

这是一个简单的例子:

$ ls
secret.txt
$ cat secret.txt
I am the Walrus.
$ cat secret.txt > /dev/null
$ cat socrates.txt > /dev/null
cat: socrates.txt: No such file or directory
$ cat socrates.txt >& /dev/null
$ echo Done.
Done.

如果将cat的标准输出重定向到/ dev / null,则不会显示任何内容,因为所有位都已扔到虚拟的“永久垂直文件”中。 但是,如果您输入有误,则会显示错误消息,该错误消息会发出标准错误消息。 如果要忽略所有输出,请使用>&运算符将stdoutstderr发送到位存储桶。

您还可以将/ dev / null用作零长度文件,以清空现有文件或创建新的空文件:

$ cat secret.txt
Anakin Skywalker is Darth Vader. 
$ cp /dev/null secret.txt
$ cat secret.txt
$ echo "The moon is made of cheese!" > secret.txt
$ cat secret.txt
The moon is made of cheese!
$ cat /dev/null > secret.txt
$ cat secret.txt
$ cp /dev/null newsecret.txt
$ cat newsecret.txt
$ echo Done.
Done.

顺便说一句,如果您碰巧在Macintosh上使用UNIX,请在“终端”窗口中尝试open命令。 例如,如果当前工作目录中有一个名为poodle.jpg的文件,则命令open poodle.jpg启动Preview(内置Mac OS X图像查看器),并带有您的贵宾犬的图片。 Mac OS X open是命令行和Macintosh的窗口环境之间的重要链接-而且通常比诉诸Finder快得多。

必须再次访问!

ew! 那是一堂快节奏的课,但是现在您已经准备好进一步深入UNIX。 您甚至都知道大自然母亲来电话时比特桶在哪里。

与往常一样,还有更多内容要讲。 在接下来的几个月中, Speaking UNIX系列将深入研究作业控制,正则表达式(可以肯定,但并非不可能掌握的一种方言),如何构建可从Internet下载的新实用程序等等。

不要忘记防晒霜。


翻译自: https://www.ibm.com/developerworks/aix/library/au-speakingunix7.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值