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

我一直在寻找这样一个讨论,以分享下面的评论,但还没有'我找到了一个,因此发布了这篇文章。

我希望我们都可以从中学到。

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

评论

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

这个问题可能有点广泛-Linux / Unix命令行最佳实践足以填满整本书...

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

我认为编译人们使用的最有用和最有趣的命令列表是一个好主意。

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

#1 楼

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

您可以启动会话,即使连接断开也可以保存终端,因此您可以稍后或在家中恢复。

评论


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

– Nick Devereaux
09年3月5日在1:41

屏幕的另一个好处是,当您想在某事上进行协作时,可以与其他人共享终端,方法是使用屏幕-x

–gareth_bowles
09年3月12日在18:40

#2 楼

SSH!
SSH是上帝的命令-我认为这是学习最有价值的总体命令。这些选项可能非常艰巨,但似乎我一直在不断学习对SSH使用新的命令行选项,而我从来没有想过这是必需的。在这一点上,我可能已经全部使用了。

使用得越多,您就越了解。您可以使用它来做一些令人惊奇的事情。

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

安装文件。 Internet上的系统

在网上搜索SSHFS

转发命令。

SVN + SSH协议是从远程客户端到没有运行DEAMON的服务器的Subversion! 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”(没有其他内容)时,它的行为就像我键入的内容一样:
< br q
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  'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub


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

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

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

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

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

评论


+1非常好和紧凑的帖子

–卡斯滕
09年3月3日在12:20

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

– David Wolever
09年9月13日在16:04

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

– Bill K
09年9月14日在15:49

如今,大多数ssh版本中都有最后一个命令的内置版本,称为ssh-copy-id,就像ssh-copy-id user @ someserver一样简单

–JamesHannah
09-10-20在15:20

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

– toppledwagon
09-10-20在20:36

#3 楼

我喜欢使用

cd -


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

评论


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

– KarstenF
09年3月3日在19:40

这是启蒙运动。

–曼努埃尔·费拉拉(Manuel Ferrara)
09年3月7日在21:07

#4 楼

我最近发现了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

– kyku
09年3月5日在16:30

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

– Nick Devereaux
2009年3月5日23:55

看起来像旧的tee(1)。

–Daniel C. Sobral
10 Mar 30 '10在19:44

一种非常有用的实用程序,我一直忘了它:-(

–干粉
2012年1月27日,下午2:57

#5 楼

sudo !!


以root身份重新运行上一个命令。

[网站http://www.commandlinefu.com上的当前最高命令,该网站的主题与此类似问题。]

评论


披露-我运行commandlinefu.com

–钻孔编码
09年3月2日在21:52

它将为这个家伙保存16个字符:xkcd.com/149

– Bill K
09年3月3日在19:06

#6 楼

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

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

有一天,朋友说在命令行上看着我看着我输入类似的内容:

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


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

评论


在我看来,制表符补全似乎是“显而易见的”,非常基本,但我也不知道popd / pushd。确实很有趣。 :)

– Jonik
09年3月2日在20:46

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

– Jonik
09年3月2日在21:20

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

– sigjuice
09年3月23日在5:41

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

–保存
09年12月18日在21:36

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

–slm
11年7月30日在4:42

#7 楼

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

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


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

评论


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

–亚当
09年3月7日在16:56

Ctrl-S跳至下一个匹配项。您可能必须先执行stty -ixon才能关闭XON / XOFF流控制的含义(这也使Ctrl-Q可用,默认情况下它映射为与Ctrl-V引号插入相同,但是您可以更改它到别的东西)。有关更多信息,请参见man stty和man readline。可以将stty命令添加到您的〜/ .bashrc中

–丹尼斯·威廉姆森
09-9-26 at 14:58

#8 楼

学习Vim。

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

评论


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

– Piotr Findeisen
09年6月16日在19:12

这也非常有用,因为一旦您知道了vim,就可以将大多数shell置于vi-mode,导航将变得非常容易和快捷。

–干粉
2012年1月27日在2:59

#9 楼

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

$ your_command_here & disown


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

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


评论


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

–保存
09年3月2日在21:54

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

–user18911
2009年3月5日,下午2:47

同上重新放弃,尽管我已经在屏幕上做过同样的事情

–安迪
09年3月6日在22:40

#10 楼

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

\rm -rf ~/tmp


评论


这与“命令rm -rf〜/ tmp”相同吗?

–马克西姆·维克斯勒(Maxim Veksler)
09年3月2日在19:58

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

–mouviciel
09年3月2日在20:38

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

– Jamol
09年3月3日在8:55

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

– David Santamaria
09年3月3日在9:13

另请参见类似的命令“ builtin”。

–丹尼斯·威廉姆森
09-09-26 14:50

#11 楼

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

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

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


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

评论


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

–短暂
09年3月2日在21:06

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

–user18911
2009年3月5日,下午2:45

+1为执行重击

–丹尼斯·威廉姆森
09-9-26 at 15:01

阅读人工readline并记住其默认快捷方式也很有教育意义

– SaveTheRbtz
10年7月6日在18:35

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

–干粉
2012年1月27日,下午3:02

#12 楼

一次执行多个命令时,请使用&&而不是;。错误发生时停止,并且不执行其他命令。

经典示例:

./configure && make && make install


评论


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

–user18911
09年3月5日在2:57

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

–尼克·克劳尔(Nick Klauer)
09年3月15日在2:45

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

–stribika
09年8月8日在11:32

您可以在“ else”子句中使用双管道:dosomething && echo“ success” ||回声“失败”

–丹尼斯·威廉姆森
09-9-26 at 15:04

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

–ptman
09年11月24日11:00

#13 楼

用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。

评论


我也这样做,非常方便!

–user18911
2009年3月5日,下午2:48

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

–大卫·奥尼尔(David Oneill)
2010-11-30 2:29

#14 楼

要求

您需要测试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开销)。

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

评论


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

– Joachim Sauer
09年3月2日在20:46

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

–丹尼尔·冯·范格(Daniel Von Fange)
09年3月3日,0:22

使用netcat代替

– Bendin
09年3月3日在5:49

+1代表netcat。 SSH的开销将扭曲您的数字

– Mikeage
09年3月3日在8:02

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

–马克西姆·维克斯勒(Maxim Veksler)
09年3月3日在8:49

#15 楼

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

alias ls="ls --color=tty"


编辑

alias ls="ls --color=auto"


评论


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

– kyku
09年3月2日在19:51

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

– Jonik
09年3月2日在20:40

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

– joshudson
09年3月2日在21:54

更新以反映颜色=自动

– Suroot
09年3月3日,0:11

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

–匿名
09年3月3日在2:52

#16 楼

有关查看日志的一些小提示:


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


评论


使用tail -f,您可以一次观看多个日志!例如:tail -f log1.txt -f log2.txt

– Stu Thompson
2012年2月16日于12:12

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

–马克西姆·维克斯勒(Maxim Veksler)
2012年2月16日15:21

#17 楼

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

mv my_filename.{old,new}


Shell扩展会将其扩展为:

mv my_filename.old my_filename.new


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

mv my_{,cool_}filename


评论


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

–user9495
09年9月13日在16:24

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

–斯科特·艾伦(Scotty Allen)
09年9月13日在17:44

您也可以输入例如ls -l / bin / c,然后按Alt-Shift- {,它将完成此操作,类似于ls -l / bin / c {at,h {grp,mod,own,vt} ,p {,io},sh}给您。

–丹尼斯·威廉姆森
09-9-26 at 16:05

#18 楼

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

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

评论


是的,我有别名ut =“ tar xf” –使提取存档更加容易。

– David Wolever
09-09-13 16:16

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

– pvsnp
09-10-20在21:27

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

–休伯特·卡里奥(Hubert Kario)
2010-09-30 17:44

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

– Zitrax
2011年1月3日,17:33

#19 楼

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

#20 楼

我经常使用这些


CTRL-W删除单词

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

ALT-B(在某些终端中为ESC + B)向后移动一个单词

ALT-F(在某些终端中为ESC + F)向后移动一个单词
< br CTRL-E跳转到EOL

CTRL-A跳转到BOL

CTRL-R在历史记录中搜索

评论


感谢您分享快捷键!我没有在Mac上使用ALT-B / F。

–LéoLéopoldHertz준영
09年3月23日在18:07

太棒了...

–达德·艾哈迈德·科卡(Daud Ahmad Khokhar)
2010-2-4在14:02

#21 楼

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

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


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

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

我忘了noclobber:

set -o noclobber


来自bash:


如果设置,bash会不要使用>,>&和<>
重定向操作符覆盖现有文件。通过使用重定向运算符> |
代替>。

,可以在创建输出文件时
覆盖

评论


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

– David Wolever
09-09-13 16:16

根据您的键盘等,您可以执行Alt-。也一样

–丹尼斯·威廉姆森
09-09-26 15:26

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

– artifex
2010-3-11在12:38

#22 楼

从bash切换到zsh,可以看到工作效率的提高:


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

Google会告诉您更多好处。

评论


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

– Cory R. King
09年3月2日在20:47

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

– kyku
09年3月2日在20:50

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

– flodin
09年3月2日在20:54

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

– flodin
09年3月2日在20:55

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

– Cory R. King
09年3月2日在21:24

#23 楼

老派,将目录树从一个位置移动到另一个位置,保留符号链接,权限和所有好的功能:

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上更易于使用。

–短暂
09年3月2日在21:08

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

– dr-jan
09年4月20日在21:10

-z是否优于ssh?我不会这样。

– Paul Tomblin
09年4月20日在22:44

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

– RichVel
2011年8月27日7:41



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

– Paul Tomblin
11年8月27日在16:55

#24 楼

要求:您有一个目录,其中包含要删除的大量文件。 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 ... +,您会发现它很有用。

评论


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

–短暂
09年3月2日在21:09

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

–钻孔编码
09年3月2日在21:55

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

–马克西姆·维克斯勒(Maxim Veksler)
09年3月3日在7:47

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

–user18911
2009年3月5日,3:01

或只是找到...-删除,如果您的发现如此被赋予。

– David Wolever
09年9月13日在16:20

#25 楼

我经常使用这两个技巧,以至于我认为最好共享一下:

!foo


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

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

希望获得帮助!

#26 楼

在没有可能无法使用的精美图形界面的情况下如何在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。

– kyku
09年3月2日在20:15

当然,可以使用许多精美,功能强大的GUI(例如IntelliJ IDEA中的GUI),但是我喜欢使用那些图形用户界面或命令行(也很强大,但有所不同)的可能性-哪种方式更适合当前情况

– Jonik
09年3月2日在21:18

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

–user7655
2009年3月3日14:00

#27 楼

最容易被忽视的老式命令:find

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

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


评论


是!了解find命令。查找与xargs,sed和awk混合使用的文件处理工具!

–乔纳森·沃特尼(Jonathon Watney)
09年3月3日在1:08

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

– KarstenF
09年3月3日在1:22

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

–user18911
2009年3月5日,下午2:55

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

– David Wolever
09-9-13 at 16:33

不要忘记使用-perm选项来查找具有某种设置权限的文件。

–丹尼斯·威廉姆森
09-9-26 at 16:07

#28 楼

对于bashksh之类的shell,您可以使命令行响应文本编辑器之类的导航命令:

set -o emacs




set -o vi


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

评论


轻微错字:“测试编辑器”应为“文本编辑器”

– Sean
09年3月2日在22:16

#29 楼

grep是我的朋友。认真地。

列出包含文本.rbclass foo文件:

grep -l "class foo" .rb


列出不包含文本.rbclass foo文件:

grep -L "class foo" *.rb


列出不包含foo或bar的.rb文件(您可以将任何regexp与-e一起使用,但需要对运算符进行转义):

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


评论


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

– kyku
09年5月5日在18:40

#30 楼

使用^执行外壳替换:

/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


评论


实际上,我更喜欢“ !!:gs / foo / bar”,因为我经常发现在上一个命令中不止一次提到foo,而且我想要全局替换(例如“ mv foo.txt foo.bak”)。

–user18911
09年3月5日在3:07