【问题标题】:Linux command line best practices and tips?Linux 命令行最佳实践和技巧?
【发布时间】:2009-03-02 19:46:09
【问题描述】:

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

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

我希望我们都能从中吸取教训。

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

【问题讨论】:

  • 为什么只有 Linux?许多技巧可能对几乎所有风格的 Unix 都有用。
  • 这个问题可能有点宽泛——Linux/Unix 命令行最佳实践足以填满整本书......
  • 我同意可以应用于 linux 的 unix 技巧也非常受欢迎,我写 linux 是因为 A. 这是我们在这里工作的。 B. 因为近年来它获得了比 unix 更广泛的公众曝光度。
  • 我认为编制一份人们使用的最有用和最有趣的命令列表是个好主意。
  • 这些是否相关? refspecs.freestandards.org

标签: linux bash


【解决方案1】:

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

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

【讨论】:

  • 我最常用的开关是'screen -D -R' 用于分离和恢复我的最后一个屏幕会话,'screen -x' 用于从多个登录查看同一个屏幕会话。另外,从dotfiles.org/.screenrc 为自己获取一个不错的 .screenrc
  • screen 的另一个好处是,当您想在某事上进行协作时,您可以与其他人共享终端,使用 screen -x
【解决方案2】:

SSH!
SSH 是神命令——我认为它是最有价值的学习命令。这些选项可能非常令人生畏,但似乎我一直在学习为 SSH 使用新的命令行选项,而我从未认为这是必要的。在这一点上,我可能已经全部使用了它们。

您使用它的次数越多,您对它的了解就越多。你可以用它来做一些很棒的事情。

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

通过互联网安装文件系统

在网上搜索 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 的强大游戏 PC 提供大量应用程序/X。

当然 VI 和 EMACS 通过 SSH 工作,但是当我在家跑步时,有时我想要更多。我使用 ssh -X 来启动 Eclipse 的副本!如果你的服务器比你的笔记本电脑更强大,你的笔记本电脑上就有 GUI,但编译是在你的服务器上完成的,所以不用担心系统负载。

在批处理文件中运行

(意思是在其他系统上运行一个本地批处理文件):

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

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

内置于 Mac

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

在 PC 上安装 cygwin 或 cygwin/X(cygwin/X 将允许您将 x-window 输出从 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 服务器配置为不允许使用文本密码(仅限密钥)以提高安全性。

【讨论】:

  • +1 非常漂亮紧凑的帖子
  • 关于通过端口 22 进行 SSH 的一个小提示:只要您有一个好的 root 密码并且您的用户没有糟糕的密码,只需运行 fail2ban(或类似的东西)就足以防止破解尝试。我发现将 SSH 保留在另一个端口上真的很烦人。
  • 有时会很烦人,但连接的数量实在是太吓人了。我知道他们不应该通过,但这有点像有人走到你家,每分钟都在摆弄你的门把手——只是令人不安。
  • 现在大部分ssh版本都有你最后一个命令的内置版本,叫做ssh-copy-id,简单到ssh-copy-id user@someserver
  • 另一种实现“ssh mac”技巧的方法是在 .ssh/config 文件中使用 ProxyCommand 指令。 Host mac ProxyCommand ssh -q home "nc %h %p" 这将在 home 上运行 netcat (nc) 并将您的 ssh 连接直接重定向到 mac。我发现那些更容易链接(例如,如果您需要连接到“家”以访问“工作堡垒”以访问“工作网络服务器”。
【解决方案3】:

我喜欢用

cd -

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

【讨论】:

  • 我从来不知道这个!谢谢!在相关的说明中,pushd 和 popd 做了类似的事情,通过建立一堆 dirs。当您在深层目录结构中导航时,这些技巧会有所帮助。
  • 这是纯粹的启示。
【解决方案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

因此,现在您将知道您的手术何时结束,而不是不知道什么时候结束!

Courtesy of Peteris Krumins

【讨论】:

  • $ gzip -c access.log > access.log.gz 为什么不只是:$gzip access.log
  • 哦,那行得通 :) 我刚刚从 Peteris 的网站上举了一个例子。
  • 这看起来很旧tee(1)
  • 非常有用的实用程序,我总是忘记一个:-(
【解决方案5】:
sudo !!

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

[http://www.commandlinefu.com 站点上的当前 top 命令,该站点以该问题为主题。]

【讨论】:

  • 披露 - 我运行 commandlinefu.com
  • 这会为这家伙节省 16 个字符:xkcd.com/149
【解决方案6】:

命令行是个有趣的东西。我认为你只能自己学习这么多,其余的都是通过观察别人使用命令行时偶然学到的。

多年来,我一直在煞费苦心地手动输入目录名称。有一天,我看到一个朋友在系统上乱搞,他一直在按 Tab 键。我问“你为什么要点击标签?”。答:它会尝试完成目录或文件名。谁会猜到——制表符补全!键入一点文件或目录,点击选项卡,它会尝试完成您键入的内容(但行为取决于哪个 shell)。

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

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

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

【讨论】:

  • 对我来说,tab 补全似乎是“显而易见的”,非常基本,但我也不知道 popd/pushd。确实好笑。 :)
  • 另请参阅此答案,以便能够完成比命令、文件和目录更多的选项:stackoverflow.com/questions/603696//603919#603919
  • 确实如此。我通过观察某人了解了 bash 的向后历史搜索 (ctrl-r)。后来我意识到这是一个 readline 功能,并且在包含 readline 的其他程序(mysql、gdb、python -i、clisp 等)中也能正常工作。
  • 你怎么能使用“外壳”多年而不知道制表符补全?
  • 在处理 pushd/popd 时不要忘记提及命令 dirs。它显示了 pushd/popd 堆栈上的内容。
【解决方案7】:

Ctrl-R 并开始输入命令(或其任何部分) - 它会搜索命令历史记录。再次按 Ctrl-R 将跳转到下一个匹配项,回车执行当前显示的命令,右箭头(至少)会让你先编辑它。

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

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

【讨论】:

  • 谢谢。我一直在使用反向搜索,但无法弄清楚如何跳转到下一个匹配项。
  • Ctrl-S 跳转到下一个匹配。您可能必须先执行stty -ixon 才能关闭 XON/XOFF 流控制含义(这也使 Ctrl-Q 可用,默认情况下它映射为与 Ctrl-V 引用插入相同,但您可以更改它到别的东西)。请参阅man sttyman readline 了解更多信息。 stty 命令可以添加到您的~/.bashrc
【解决方案8】:

学习 Vim。

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

【讨论】:

  • gvim 也是 windows 上最好的文件浏览器 ;)
  • 这也是非常有用的,因为一旦你了解了vim,你可以将大多数shell设置为vi-mode,导航变得非常容易和快速
【解决方案9】:

即使在您注销后让程序继续运行有时也很有用。我已经看到了一些使用 nohup 甚至 screen 来实现此目的的解决方案。我知道的最简单的是:

$ your_command_here & disown

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

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

【讨论】:

  • 使用屏幕非常棒,因为您以后可以从任何地方“重新连接”到该应用程序。
  • +1,我没听说过否认。
  • ditto re disown,虽然我已经对 screen 做了同样的事情
【解决方案10】:

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

\rm -rf ~/tmp

【讨论】:

  • 这个和“command rm -rf ~/tmp”一样吗?
  • 我不知道“命令”,但看起来一样。
  • 嗯,是的,除非“命令”不是别名,在这种情况下你必须使用 \command rm -rf ~/tmp 在这种情况下 \rm -rf ~/tmp 更好
  • @presario,您认为可以为“/”创建别名吗?可惜我不能投票给 cmets :)
  • 另见类似命令“builtin”。
【解决方案11】:

这个技巧会让你的 CLI 更舒服(至少对我来说):

使用以下内容创建 ~/.inputrc 文件:

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

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

【讨论】:

  • 通常我将它们绑定到 \e[5~ 和 \e[6~ (又名 pageup 和 pagedown)而不是重新绑定箭头,但它比 Ctrl-R/Ctrl-S 更方便: )
  • +1。我将这些绑定到 F8 和 Shift-F8 以模仿 cmd.exe,但同样的原理也适用。
  • exec bash+1
  • 阅读man readline 并记住它的默认快捷方式也很有教育意义
  • 您也可以使用bind -f ~/.inputrc 重新加载 inputrc,而无需启动新的 bash 并清除当前环境。
【解决方案12】:

同时执行多个命令时使用&amp;&amp; 而不是;。它在发生错误时停止并且不执行其他命令。

经典例子:

./configure && make && make install

【讨论】:

  • 这种做法被低估了!以 && 结束 shell 脚本的每一行并使用“true”作为最终命令应该是标准做法。
  • 有趣的是我不知道';'之前的命令——我一直使用'&&'。
  • 您可以使用“#!/bin/sh -e”启动 shell 脚本。如果任何一行出现故障,这将停止。
  • 您可以为“else”子句使用双管道:dosomething &amp;&amp; echo "success" || echo "teh fail"
  • 最近在 Planet Debian 上有一个说明,在 shebang 行上使用 -e 是不好的做法。而是在脚本正文中使用 set -e。这样,如果有人碰巧使用 sh $filename 运行,脚本的工作方式不会有所不同。
【解决方案13】:

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

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

通过这种方式,我可以在承诺运行之前全面了解“有风险的事情”。当您的危险命令包括变量扩展和 glob 时会有所帮助。 'set -x' 在编写 bash 脚本时非常有用。

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

【讨论】:

  • 我也这样做,非常好用的把戏!
  • +1 这可以救命!或数据保护程序...
【解决方案14】:

要求

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


解决方案

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 中使用压缩,'虽然。否则你会得到与事实相去甚远的非常好的数字;-)
  • 大声笑,是的。并且 SSH 将冲击你的 CPU 加密和解密,这也会使数字丢失。
  • 改用netcat
  • +1 表示 netcat。 SSH 的开销会扭曲您的数字
  • 重构以修正@saua、@Daniel Von Fange 和@bendin 的建议。谢谢你们的建议。
【解决方案15】:

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

alias ls="ls --color=tty"

编辑

alias ls="ls --color=auto"

【讨论】:

  • 我更喜欢 --color=auto 因为如果重定向到文件它不会发送垃圾控制字符,您也可以执行 alias grep="grep --color=auto" 以突出显示匹配的模式。
  • +1 表示 --color=auto;有人可以用它来补充答案吗?
  • 我认为 tty 和这里的 auto 是一样的。
  • 已更新以反映 color=auto
  • 奇怪的是,着色让我的可读性大大降低。例如,黄底白字不是一个好的颜色选择。
【解决方案16】:

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

  1. 您可以使用 tail -F 在日志被截断后继续查看日志(例如 log4j)。
  2. 你可以使用less:打开less,点击SHIFT+F模拟尾部行为。同样有用的组合是 -S 来禁用换行。 less 将使您能够在日志中进行搜索。

【讨论】:

  • 使用tail -f,您可以同时观看多个日志!例如:tail -f log1.txt -f log2.txt
  • @StuThompson:谢谢。不知道。此外,您可能想结帐vanheusden.com/multitail
【解决方案17】:

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

mv my_filename.{old,new}

Shell 扩展会将其扩展为:

mv my_filename.old my_filename.new

这也可以用于以其他方式重命名文件,例如在:

mv my_{,cool_}filename

【讨论】:

  • 请确保不要在同一命令中放置任何通配符或其他模式表达式,否则 glob 可能会扩展到不止 2 个参数! mv *.{old,new} 可能会产生非常令人惊讶的结果。
  • 是的,同意 - 这是一个重要的警告:)
  • 您也可以输入,例如,ls -l /bin/c,然后按 Alt-Shift-{,它会为您完成类似于 ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh} 的内容。
【解决方案18】:

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

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

【讨论】:

  • 是的,我有alias ut="tar xf"——让提取档案变得更加容易。
  • 如果您使用某些 RHEL 发行版,这将失败。
  • 新的 tar 还具有“J”开关,用于压缩到 xz(基于 7zip)档案
  • 或者安装 unp:packages.debian.org/sid/unp。我猜它类似于 unfoo。
【解决方案19】:

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

【讨论】:

    【解决方案20】:

    我经常使用这些

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

    CTRL-W 删除单词

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

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

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

    CTRL-E 跳转到 EOL

    CTRL-A 跳转到 BOL

    CTRL-R 历史搜索

    【讨论】:

    • 感谢您分享快捷方式!我没有让 ALT-B/F 在 Mac 中工作。
    • 很棒的人....
    【解决方案21】:

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

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

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

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

    我忘了noclobber:

    set -o noclobber
    

    来自man bash

    如果设置,bash 不会覆盖 带有 >、>& 和 的现有文件 重定向运算符。这可能是 创建输出文件时被覆盖 通过使用重定向运算符 >| 而不是>。

    【讨论】:

    • 我不使用$!,因为它很容易使手指变胖,但我喜欢敲^[-。 (escape-period) 以获得相同的效果。
    • 根据您的键盘等,您也可以使用Alt-.
    • 天啊,小小的高潮,丹尼斯!
    【解决方案22】:

    从 bash 切换到 zsh,看看您的工作效率是否有所提高:

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

    Google 会告诉您更多好处。

    【讨论】:

    • 您应该提供比链接更多的信息。听起来很有趣,但把它卖给我吧!
    • 他们是否设法包含了 unicode 支持?
    • @Cory 好吧,我只是不想抄袭,当别人已经写了这么多好东西时,我自己写感觉是多余的:)
    • @kyku 是的,大概一年前就有了适当的 unicode 支持。
    • 看起来很酷。我试试看!
    【解决方案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 更容易使用。
    • -a 与 '-rlptgoD' 相同 - 即递归,将符号链接复制为符号链接,保留权限,保留时间戳,保留组,保留所有者,将设备文件和特殊文件复制为设备和特殊文件文件。此外,在机器之间,-z(发送前压缩文件,接收后解压缩)很有用。 rsync -avz [-e ssh] 是你的朋友 :-)
    • -z 对 ssh 有什么好处吗?我不这么认为。
    • rsync -avh 最好在单台机器上使用 - h 确保正确传输硬链接,而不会将每个链接变成单独的文件,但如果您有大量文件,它可以使用很多内存。 rsync -avzh . foo.com/destination 相当于网络,通常你不需要 -e ssh,因为 rsync 知道使用 ssh。
    • 其实这几天我在用rsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
    【解决方案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 '{}' +
    

    说明

    编辑:修正@ehemient 评论后的解释。

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

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

    如果您的 find 不支持 -exec ... +,您可能会发现它很有用。

    【讨论】:

    • \; 替换为+:然后find 将执行xargs 默认执行的操作,即尽可能批量处理参数(不会超出参数列表限制)。或者只使用-delete 而不是-exec rm(两者都需要GNU Findutils)
    • 好提示 - 我不知道 '+' 那个。
    • @ephemient:很好的评论,我已经编辑了帖子。
    • 有趣,我没听说过'+'。
    • 或者只是find ... -delete,如果你的发现是如此得天独厚的话。
    【解决方案25】:

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

    !foo
    

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

    另一个是键盘快捷键(Ctrl+O 而不是 Return),它将执行命令并在历史文件中显示下一个命令。例如,当我编译和测试一个文件时,我总是执行 3 或 4 个命令,make,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。
      • 当然可以使用许多花哨、强大的 GUI(例如 IntelliJ IDEA 中的 GUI),但我喜欢使用这些或命令行的可能性(也很强大,但不同) - 以适合当前情况为准更好
      • 我最喜欢的是 NautilusSVN(很像 TortoiseSVN):code.google.com/p/nautilussvn
      【解决方案27】:

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

      昨天我修复了一个严重的权限错误:

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

      【讨论】:

      • 是的!学习 find 命令。 Find 与 xargs、sed 和 awk 混合使用,成为文件处理的巨无霸!
      • 同意!虽然我从不记得关于 sed 和 awk 的任何事情——我总是需要重新学习它!我真的应该打印一份备忘单。
      • 是的,但不要忘记使用 -print0 和 xargs 的 -0 选项以避免涉及包含异常字符(例如反斜杠)的文件名的棘手问题。
      • 是的,可能有一半的时间我发现它是为了解决愚蠢的权限问题:chmod 644 $(find . -type f), chmod 755 $(find . -type d)
      • 不要忘记find-perm 选项以定位具有特定权限设置的文件。
      【解决方案28】:

      对于 bashksh 这样的 shell,您可以让命令行响应文本编辑器等导航命令:

      set -o emacs
      

      set -o vi
      

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

      【讨论】:

      • 小错误:“测试编辑器”应该是“文本编辑器”
      【解决方案29】:

      grep 是我的朋友。认真的。

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

      grep -l "class foo" .rb
      

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

      grep -L "class foo" *.rb
      

      列出包含 foo 或 bar 的 .rb 文件(您可以使用任何带有 -e 的正则表达式,但您需要转义运算符):

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

      【讨论】:

      • 您可能对名为“ack”的工具感兴趣,它与 grep 执行相同的操作,但只会递归扫描源文件。试一试(免费):betterthangrep.com
      【解决方案30】:

      使用^ 执行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
      

      【讨论】:

      • 其实我更喜欢 "!!:gs/foo/bar" 因为我经常发现 foo 在上一个命令中不止一次被提及并且我想要一个全局替换(例如 "mv foo.txt foo .bak")。
      猜你喜欢
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2012-01-15
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多