Linux命令行最佳实践和技巧?


112

我想打开一个讨论,该讨论将积累您的Linux命令行(CLI)最佳实践和技巧。

我已经搜索了这样的讨论以分享以下评论,但没有找到评论,因此发布了这篇文章。

我希望大家都能从中学到东西。

欢迎您分享Bash技巧,grep,sed,AWK,/ proc和所有其他相关的Linux / Unix系统管理,shell编程最佳实践,以使我们所有人受益。


为什么只使用Linux?在几乎所有版本的Unix上,许多技巧都可能有用。
mouviciel

这个问题可能有点笼统-Linux / Unix命令行最佳实践足以填满整本书...
Jonik,2009年

我同意可以应用于linux的unix技巧也非常受欢迎,因为A,所以我写了linux。这就是我们在这里使用的。B.因为与Unix相比,它近年来获得了更广泛的公众关注。
Maxim Veksler,2009年

我认为最好是整理人们使用的最有用和最有趣的命令列表。

这些是否相关? refspecs.freestandards.org

Answers:


111

Use screen,这是GNU Project开发的免费终端多路复用器,可让您将多个终端合二为一。

您可以开始一个会话,并且即使连接断开也可以保存您的终端,因此您可以稍后或在家中恢复。


2
我最常用的开关是“ screen -D -R”,用于分离并恢复我的上一个屏幕会话,而“ screen -x”用于从多个登录中查看同一屏幕会话。另外,从dotfiles.org/.screenrc中
Nick Devereaux

4
屏幕的另一个
好处

101

SSH!
SSH是最重要的命令-我认为它是最有价值的整体命令。这些选项可能非常艰巨,但似乎我一直在不断学习对SSH使用新的命令行选项,而我从未认为这是不必要的。在这一点上,我可能已经用尽了它们。

使用的次数越多,您就会学到更多。您可以使用它来做一些令人惊奇的事情。

注意:所有这些操作都可以在远程运行,而无需运行ssh服务器,而无需在服务器上进行任何设置。

通过Internet挂载文件系统

在网上搜索SSHFS

转发命令

SVN + SSH协议是从远程客户端到服务器的Subversion转换,上面没有运行DEAMON!SVN命令通过ssh shell启动服务器,并通过现有管道来回传递信息。rsync程序执行相同的操作,通过SSH自身启动没有rsync守护程序的服务器。编写自己的bash文件来完成类似的技巧很容易。

链接到防火墙

我一直使用它来在家中通过linux服务器跳转到我的mac。

转发端口:
似乎只有中等程度的有用,直到您意识到可以通过家庭防火墙反弹并在家中配置路由器(就像从家庭网络中进行配置一样)。

转发X请求:

这是另一个了不起的。在远程系统上运行或不运行X服务器的情况下,都可以运行x-windows程序,并且该窗口将显示在本地屏幕上。只需使用-X开关,仅此而已!

由于不必在远程服务器上运行X服务器,因此对服务器的CPU影响最小,因此您可以使用TINY Linux服务器,为运行Windows和cygwin / X的强大游戏PC提供庞大的应用程序。

VI和EMACS当然可以通过SSH进行工作,但是当我在家中运行时,有时我会需要更多。我使用ssh -X启动Eclipse的副本!如果您的服务器比笔记本电脑功能强大,那么您的笔记本电脑上就已经有GUI了,但是编译是在服务器上完成的,因此不必担心系统负载。

在批处理文件中运行

(这意味着运行在其他系统上“可做”的本地批处理文件):

两件事结合在一起使这一过程变得很酷。一种是您可以通过使用(更安全的)加密密钥来消除密码提示。第二个是您可以在SSH CLI上指定命令。我已经以一些有趣的方式使用了它-就像当远程服务器上的编译失败时,我会将它SSH到我的计算机中并播放声音文件)。

请记住,您可以重定向远程命令的输出,并在本地批处理文件中使用它,因此您也可以在本地跟踪服务器上运行的编译器。

内置于Mac

服务器和客户端都内置在mac和linux中。对于Mac和Ubuntu,启用服务器就像找到正确的复选框一样简单。

在PC上安装cygwin或cygwin / X(cygwin / X允许您将x窗口输出从Linux机器转发到Windows PC -它安装了X服务器)

重要提示/配置文件

切勿在防火墙上使用端口22。您将获得很多黑客尝试,但这是不值得的。只是让防火墙将其他端口转发到服务器即可。

有广泛的配置选项,可让您显着简化ssh命令。这是我的一个工作示例:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

当我键入“ ssh home”(没有其他内容)时,它的行为就像我键入的那样:

ssh -p 12345 bill@billshome.hopto.org

然后将本地端口1025转发到我的系统“ mac”。原因是我的文件中还有另一个条目:

Host mac
    hostname localhost
    port=1025

这样,当我完成“ ssh home”并且仍然打开窗口时,我可以键入“ ssh mac”,并且这里工作的计算机实际上将尝试连接到自己的端口1025,该端口已转发给“ mac: 22“,则它将通过防火墙连接到我的Mac。

编辑-很棒的脚本!

我挖了一个我只是喜欢的旧脚本-必须回来将它发布给可能对此感兴趣的任何人。该脚本称为“ authMe”

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

如果您的主目录中有此脚本,并且可以通过ssh连接到主机,则可以键入“ ./authMe hostName”。

如有必要,它将为您创建一个公用/专用密钥对,然后它将ssh切换到另一台计算机并复制您的公钥(ssh命令将提示您输入密码...)

此后,SSH命令在连接到该远程系统时不应再询问您的密码,它将使用公用/专用密钥对。

如果您的远程计算机并不总是安全的,则应在提示时考虑设置“密码”。

您可能还希望在远端将ssh服务器配置为不允许文本密码(仅密钥)以提高安全性。


4
+1非常好和精简的帖子
Karsten

2
关于通过端口22的SSH的小注释:如果您具有一个好的root密码,并且您的用户没有可怕的密码,只需运行fail2ban(或类似的东西)就足以阻止破解尝试。我发现将SSH保留在另一个端口上确实很烦人。
David Wolever 09年

1
有时可能会令人烦恼,但是连接的数量却很可怕。我知道他们不应该通过,但是这就像您让某人每分钟走到您的房屋并摆弄门把手-简直令人不安。

如今,在大多数ssh版本中,您的最后一个命令都有一个内置版本,称为ssh-copy-id,它很简单ssh-copy-id user@someserver
JamesHannah,2009年

另一种执行“ ssh mac”技巧的方法是在.ssh / config文件中使用ProxyCommand指令。主机mac ProxyCommand ssh -q home“ nc%h%p”这将在home上运行netcat(nc),并将ssh连接直接重定向到mac。我发现这些链接更容易(例如,如果您需要连接到“家”以进入“工作堡垒”以进入“工作网络服务器”。)
toppledwagon

73

我喜欢用

cd -

切换到上一个目录。很有用!


6
我从来不知道!谢谢!与此相关的是,push和popd通过建立一堆dirs来执行类似的操作。在深层目录结构中导航时,这些技巧会有所帮助。

这是纯粹的启示。
曼努埃尔·费雷里亚

69

我最近发现了pv命令(管道查看器),该命令类似于cat但具有传输详细信息。

所以代替

$ gzip -c access.log > access.log.gz

您可以使用

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

因此,您将不知道何时完成操作,现在知道了!

由Peteris Krumins提供


$ gzip -c access.log> access.log.gz为什么不只是:$ gzip access.log

哦,行得通:)我只是从彼得斯的网站上举了一个例子。
Nick Devereaux

看起来好旧了tee(1)
Daniel C. Sobral

极其有用的实用程序,我经常忘记的实用程序:-(
Patrick


46

Ctrl-R并开始输入命令(或其任何部分)-它会搜索命令历史记录。再次按Ctrl-R将跳至下一个匹配项,按Enter键执行当前显示的命令,并且右箭头(至少)将使您首先对其进行编辑。

$ (reverse-i-search)`svn': svn status

在学习Linux之前,我已经将Linux作为主要操作系统使用了大约7年,但是现在我知道了,它非常方便。


谢谢。我一直在使用反向搜索,但无法弄清楚如何跳到下一场比赛。
亚当

Ctrl-S跳至下一个匹配项。您可能需要stty -ixon首先关闭XON / XOFF流控制含义(这也使Ctrl-Q可用,默认情况下它已映射为与Ctrl-V quoted-insert相同,但是您可以将其更改为其他内容)。请参阅man sttyman readline了解更多信息。该stty命令可以添加到您的~/.bashrc
Dennis Williamson 2009年

45

命令行很有趣。我认为您只能自己学习很多,其余的则是偶然地使用命令行监视其他人而学到的。

多年来,我一直在使用Shell手动输入目录名称。有一天,我看着一个朋友在一个系统上乱七八糟,他一直按着Tab键。我问“为什么要打标签?”。答:它尝试完成目录或文件名。谁能猜到-制表符完成!键入文件或目录的一部分,单击选项卡,它将尝试完成您键入的内容(但是,行为取决于哪个shell)。

一天,他说朋友在命令行上看着我,看着我键入类似以下内容的内容:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

谁能猜到!他从来不知道popd/ pushd。猜猜我们甚至...


1
对我来说,制表符补全似乎是“显而易见的”,非常基本,但是我也不了解popd / pushd。确实很有趣。:)
Jonik

3
另请参阅此答案,以制表符功能远远超过命令,文件和目录:stackoverflow.com/questions/603696//603919#603919
Jonik,2009年

1
没错 我通过观察某人来了解bash的向后历史搜索(ctrl-r)。后来我意识到这是一个readline功能,并且在其他包含readline的程序(mysql,gdb,python -i,clisp等)中也一样工作。
sigjuice,2009年

2
几年来如何使用“外壳”而不知道制表符的完成?
prestosto

在处理push / popd时,请不要忘记提及命令dirs。它显示了推入/弹出堆栈中的内容。
slm

41

学习Vim。

(可以说)它是最好的编辑器,但肯定是裸露的Linux服务器上可用的最好的编辑器。


1
gvim也是Windows上最好的文件浏览器;)

这也是非常有用的,因为一旦你知道VIM,你可以把最弹入VI-模式,导航变得非常容易和快速的
帕特里克

38

有时即使退出后仍使程序运行仍然很有用。我已经看到一些为此目的使用nohup甚至screen的解决方案。我所知道的最简单的是:

$ your_command_here & disown

您还可以分离正在运行的程序:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

6
使用屏幕非常有用,因为您以后可以从任何地方“重新连接”到该应用程序。
09年

+1,我还没听说过放弃。
8911年

尽管我已经在银幕上做过同样的事,但同上又取消了
Andy

38

当我要确保使用实际命令而不是别名时,请使用反斜杠:

\rm -rf ~/tmp

这与“命令rm -rf〜/ tmp”相同吗?
Maxim Veksler,2009年

我不知道“命令”,但是看起来一样。
mouviciel

4
好吧,是的,除非“命令”不是别名,否则在这种情况下,您将不得不使用\ command rm
-rf〜

@presario,您认为可以为“ /”创建别名吗?可惜我不能接受评论:)

另请参见类似的命令“ builtin”。
丹尼斯·威廉姆森

38

这个技巧将使您的CLI更加舒适(至少对我而言是如此):

创建具有以下内容的〜/ .inputrc文件:

"\e[A": history-search-backward
"\e[B": history-search-forward

重新加载bash(例如,键入“ exec bash”)。当您键入命令的前缀并按向上箭头时,您将浏览以前缀开头的命令,例如,如果键入ssh,它将显示以前与远程Shell的连接。如果提示为空,则向上箭头将以正常方式浏览历史记录。


3
通常,我将它们绑定到\ e [5〜和\ e [6〜(又称为pageup和pagedown),而不是重新绑定箭头,但比Ctrl-R / Ctrl-S更方便:)
09年

+1。我已经将它们绑定到F8和Shift-F8来模仿cmd.exe,但是适用相同的原理。
8911年

4
+1代表exec bash
丹尼斯·威廉姆森

这也是教育阅读man readline并记住它的默认快捷键
SaveTheRbtz

您也bind -f ~/.inputrc可以重新加载inputrc,而无需启动新的bash并清除当前环境。
Patrick

36

一次执行多个命令时使用&&代替;。发生错误时它将停止,并且不执行其他命令。

经典示例:

./configure && make && make install

1
这种做法被低估了!在shell脚本的每一行都以&&结尾并使用“ true”作为最终命令应该是标准做法。
user18911 2009年

3
有趣的是我不知道';' 之前的命令-我总是使用'​​&&'。
Nick Klauer 09年

4
您可以使用“#!/ bin / sh -e”启动shell脚本。如果任何行失败,此操作将停止。
09年

3
您可以在“ else”子句中使用双管道:dosomething && echo "success" || echo "teh fail"
Dennis Williamson 2009年

2
最近在Planet Debian上注意到,在shebang行上使用-e是不好的做法。而是在脚本主体中使用set -e。这样,如果有人碰巧使用sh $ filename运行脚本,则脚本不会以不同的方式工作。
ptman

32

当在bash上的命令行上编写循环时,我经常在带有风险的命令前加上“ echo”命令。

for item in items; do echo something-risky; done

这样,在提交运行之前,我可以完整地看到“危险的东西”。当您的冒险命令包含变量扩展名和全局名时会有所帮助。编写bash脚本时,“ set -x”非常有用。

'set -x'启用调试。有关bash调试的信息,请参见http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html


3
我也这样做,非常方便!
user18911 2009年

1
+1这可以节省生命!或数据保护程序...
David Oneill

31

需求

您需要测试2台服务器之间的最大带宽。


SERVER1上执行:

nc -u -l 54321 > /dev/null

SERVER2上执行:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

您将看到如下输出:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 MB / s是此处的有趣因素,它显示了实际的网络传输带宽。

说明

随着数据包开始在网络上流动,您将能够在SERVER2上看到带宽统计信息,这是对两个服务器之间实际最大可能带宽的不错估计。

通过UDP复制(以防止TCP开销)。

复制到存储器(的/ dev /零)上SERVER1 上SERVER2存储器(的/ dev / null的),从而防止磁盘I / O从成为瓶颈。


4
但是,请确保未将ssh配置为在.ssh / config中使用压缩。否则,您会得到非常真实的数字,与事实相去甚远;-)
Joachim Sauer

哈哈是的。SSH将会使您的CPU加密和解密受到重创,这也将使数字丢失。

改用netcat

+1为netcat。SSH的开销将扭曲您的号码
Mikeage'3

重构以修改@ saua,@ Daniel Von Fange和@bendin的建议。谢谢您的建议。
Maxim Veksler,2009年

23

查看颜色目录结构更容易。

alias ls="ls --color=tty"

编辑

alias ls="ls --color=auto"

5
我更喜欢--color = auto,因为它不会发送垃圾控制字符,如果重定向到文件,您也可以使用别名grep =“ grep --color = auto”突出显示匹配的模式。

为--color = auto +1;有人可以用这个来扩大答案吗?
Jonik

我认为tty在这里和auto一样。
joshudson

更新以反映color = auto
Suroot

奇怪的是,这种颜色使我难以理解。例如,白底黄不是很好的着色选择。

20

有关日志查看的一些小建议:

  1. 您可以使用tail -F截断日志后继续查看日志(例如log4j)。
  2. 您可以减少使用:打开较少,单击SHIFT + F以模拟尾部行为。-S也是有用的组合,用于禁用换行。less可以让您搜索日志。

1
并且,tail -f您可以一次观看多个日志!例如:tail -f log1.txt -f log2.txt
Stu Thompson '02

@StuThompson:谢谢。不知道。此外,您可能想签出vanheusden.com/multitail
Maxim Veksler,2012年

20

我很久以前从朋友那里学到了一个技巧,可以轻松更改文件的扩展名:

mv my_filename.{old,new}

Shell扩展会将其扩展为:

mv my_filename.old my_filename.new

这也可以用于通过其他方式重命名文件,例如在以下位置添加内容:

mv my_{,cool_}filename

6
只需确保不要在同一命令中放置任何通配符或其他模式表达式,否则该glob可能会扩展为两个以上的参数!mv *。{old,new}可能会产生令人惊讶的结果。

是的,同意-这是一个重要的警告:)

2
例如,您也可以键入,ls -l /bin/c然后按Alt-Shift- {,它将完成此操作,如ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}您所愿。
丹尼斯·威廉姆森2009年

19

使用“ tar xf”提取压缩的存档。不需要bzip2的j和gzip的z,因为tar将检测档案的文件类型。参数前都不是“-”号。您将节省大量时间(超过一千年;-)。

最好还是使用unfoo通过单个命令提取任何存档,而无需任何不必要的参数。


是的,我有alias ut="tar xf"–使提取档案更加容易。
David Wolever 09年

如果使用某些RHEL发行版,此操作将失败。
pvsnp

新的tar文件还具有用于压缩到xz(基于7zip)档案的“ J”开关
Hubert Kario

或安装unp:packages.debian.org/sid/unp。我猜它类似于unfoo。
Zitrax 2011年

17

安装bash-completion软件包。它包含许多Shell的预定义完成规则。如果您的发行版不适合您,请键入“ source / etc / bash_completion”来启用它。然后,例如,每当在kpdf之后完成操作时,您只会看到目录和PDF文件的列表。与在scp ssh:// server / XXX之后完成远程文件一样聪明(如果启用了无密码登录)。


17

我经常使用这些

ALT-。(在某些终端中为ESC +。)复制上次使用的参数(超级有用)

CTRL-W删除单词

CTRL-L清除终端(类似于清除命令,但速度更快)

ALT-B(某些终端为ESC + B)向后移动一个字

ALT-F(某些终端为ESC + F)向前移动一个字

CTRL-E跳至EOL

CTRL-A跳至BOL

历史记录中的CTRL-R搜索


1
感谢您分享快捷键!我没有在Mac上使用ALT-B / F。
莱奥列奥波尔德·赫兹준 영


16

在bash中,我经常使用!$。它重复最后一个命令的最后一个参数:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

它会运行ls,然后,如果要编辑它,则不必重新输入,只需使用!$。这对于长路径/文件名非常有用。此外,!*会重复先前命令的所有参数。我没有用太多,但看起来很有用。

我知道已经提到过它们,但是我经常使用vim,screen和cd。

我忘记了夜色:

set -o noclobber

来自man bash

如果设置,bash不会使用>,>&和<>重定向运算符覆盖现有文件。使用重定向操作符> |创建输出文件时,可以覆盖此方法。而不是>。


6
我不使用$ !,因为这很容易使手指发胖,但我喜欢按^ [-。(转义时间)以获得相同的效果。
David Wolever 09年

7
根据您的键盘等,您也可以这样做Alt-.
丹尼斯·威廉姆森2009年

天哪,微小的性高潮,ty丹尼斯!
artifex 2010年

14

从bash切换到zsh,发现您的工作效率有所提高:

  • 真正智能,可编写脚本的制表符完成。它不仅完成命令行,而且还完成所有选项,手册页名称,软件包名称(如apt-get / emerge等)以及您所拥有的。并在完成过程中提供了有关选项的有用说明。发出命令后,所有这些都无需使用任何回滚空间。
  • 制表符补全通配符;编写cat * .txt,按tab,然后在与表达式匹配的任何文件之间进行选择。
  • 只需输入目录名称即可切换目录。
  • 几种行编辑器模式。如果需要,可以表现得像vi或emacs。
  • 可自定义的键绑定可做任何您想做的事。
  • 主题化的提示,包括将提示信息放在屏幕右侧并在键入长命令时将其自动隐藏的功能

Google会告诉您更多好处。


1
您应该给更多的链接。听起来很有趣,但是把它卖给我吧!

他们是否设法包括unicode支持?

@Cory好吧,我只是不想to窃,当别人已经写了很多好东西的时候,写我自己的书就觉得多余了:)

@kyku是的,大约一年前就有适当的unicode支持。

看起来不错。我会试一试!

13

老派,将目录树从一个地方移到另一个地方,保留符号链接,权限和所有这些好东西:

tar cBf - . | (cd /destination; tar xvBpf -)

或整个网络

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

新学校:

rsync -urltv . /destination

或整个网络

rsync -urltv -e ssh . foo.com:/destination

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) 少键入内容,并且比ssh更易于使用。
迅速

1
-a与'-rlptgoD'相同-递归,将符号链接复制为符号链接,保留权限,保留时间戳,保留组,保留所有者,将设备文件和特殊文件复制为设备和特殊文件。同样,在机器之间,-z(发送前先压缩文件,接收后再解压缩)很有用。rsync -avz [-e ssh]是您的朋友:-)
dr-jan

-z是否优于ssh?我不会这样。
Paul Tomblin,2009年

rsync -avh最好在一台机器上使用- h确保硬链接正确传输而无需将每个链接转换为单独的文件,但是如果您有大量文件,则可能会占用大量内存。rsync -avzh . foo.com/destination是等效于网络的,通常您不需要,-e ssh因为rsync会知道使用ssh。
RichVel 2011年

实际上,这些天我正在使用rsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin

13

要求:您有一个目录,其中包含要删除的大量文件。rm -r将失败!

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

解决方案

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

说明

编辑:修复@ephemient注释后的解释。

find将通过允许的最大参数为rm提供参数。这将允许rm批量删除文件,这是我所知道的最快的技术,而无需使用find本身的-delete操作。相当于

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

如果您find不支持该功能,则可能会发现有用-exec ... +


5
替换\;+:然后find将执行xargs默认情况下的操作,即尽可能多地对参数进行批处理(不会超出参数列表限制)。或只使用-deleteintead -exec rm(两者都需要GNU Findutils)
短暂

提示-我不知道“ +”号。
codeinthehole

@ephemient:好评论,我已经编辑了帖子。
Maxim Veksler,2009年

2
有趣的是,我没有听说过“ +”。
8911年

或者仅仅是find ... -delete,如果您的发现如此有才。
David Wolever 09年

11

我经常使用这两个技巧,所以我认为分享是一个好主意:

!foo

将以“ foo”开头启动历史文件中的最后一个命令(!gcc例如,我经常在编译时使用它。)

另一个是键盘快捷键(Ctrl + O而不是Return),它将执行命令并在历史记录文件中显示下一个命令。例如,当我编译和测试文件时,我总是执行3或4条命令,将cd转到测试的目录,然后运行测试,将cd转到makefile的目录。使用Ctrl + O可以使此任务容易得多:)

希望有帮助!



10

如何在Linux上使用Subversion而不使用可能无法使用的精美图形界面。

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

奇怪的是,这使许多开发人员无法使用Linux。


Rapidsvn是Linux下svn的不错的GUI。

许多花哨,功能强大的图形用户界面当然可以(像在IntelliJ IDEA的),但我喜欢用那些要么或命令行的可能性(也强大,但是differrently) -无论适合当前形势下更好地
Jonik

到目前为止,我最喜欢的是NautilusSVN(非常类似于TortoiseSVN):code.google.com/p/nautilussvn
user7655,2009年

10

最被忽视的老式命令: find

昨天我修复了一个总权限错误:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

是! 了解find命令。查找与xargs,sed和awk混合使用的文件处理工具!
乔纳森·沃特尼

同意!尽管我不记得有关sed和awk的任何信息-我始终需要重新学习它!我真的应该打印一份备忘单。

是的,但是不要忘记对xargs使用-print0和-0选项,以避免棘手的问题,涉及包含不寻常字符(例如反斜杠)的文件名。
8911年

是的,大概是我用一半的时间来解决愚蠢的权限问题:chmod 644 $(find . -type f)chmod 755 $(find . -type d)
David Wolever 09年

1
不要忘记-perm选择以find某种方式设置权限的文件的选项。
丹尼斯·威廉姆森

8

对于诸如bash和的外壳ksh,您可以使命令行响应文本编辑器之类的导航命令:

set -o emacs

要么

set -o vi

将允许您搜索历史记录并以在文本文件中的惯用方式在命令行中移动(例如,在vi模式下,按ESC然后键入/string将在您先前的命令中搜索“字符串”-您可以使用nN移动比赛之间)


小错别字:“测试编辑器”应为“文本编辑器”

8

grep是我的朋友。说真的

列出.rb包含以下文本的文件class foo

grep -l "class foo" .rb

列出.rb的文件包含文本class foo

grep -L "class foo" *.rb

列出.rb的文件包含富或酒吧(您可以使用带有-e任何正则表达式,但你需要躲避运营商):

grep -L -e "foo\|bar" *.rb

您可能对名为“ ack”的工具感兴趣,该工具的功能与grep相同,但将仅以递归方式扫描源文件。试试看(免费):betterthangrep.com

8

Shell替换使用^以下命令执行:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory

2
实际上,我更喜欢“ !!:gs / foo / bar”,因为我经常发现在上一个命令中不止一次提到foo,而且我想要全局替换(例如“ mv foo.txt foo.bak”)。
8911年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.