标签 Shell 下的文章

我是一名Linux新用户。现在我需要清理一个下载目录中的文件,其实我就是想从~/Download/文件夹删去除了以下格式的文件外所以其它文件:

  • *.iso - 所有的iso格式的文件。
  • *.zip - 所有zip格式的文件。

我如何在一个基于Linux,OS X 或者 Unix-like 系统上的bash shell中删除特定的文件呢?

Bash shell 支持丰富的文件模式匹配符例如:

  • * - 匹配所有的文件。
  • ? - 匹配文件名中的单个字母。
  • [...] - 匹配封闭括号中的任何一个字母。

策略 #1: 见识一下扩展的模式匹配符

这里你需要用系统内置的shopt命令来开启shell中的extglob选项,然后你就可以使用扩展的模式符了,这些模式匹配符如下:

  1. ?(模式列表) - 匹配零次或一次给定的模式。
  2. *(模式列表) - 匹配零次或多次给定的模式。
  3. +(模式列表) - 至少匹配一次给定的模式。
  4. @(模式列表) - 匹配一次给定的模式。
  5. !(模式列表) - 不匹配给定模式。

一个模式列表就是一个或多个用 | 分开的模式(文件名)。

首先要打开extgolb选项:

shopt -s extglob

在Bash中删掉除.zip和.iso文件以外的所有文件

rm 命令的语法格式为:

## 仅保留 file1 文件 ##
rm  !(file1)

## 仅保留 file1 和 file2 文件## 
rm  !(file1|file2)

## 仅保留 zip 文件 ##
rm  !(*.zip)

## 仅保留 zip 和 iso 文件 ##
rm  !(*.zip|*.iso)

## 你也可以使用完整的目录 ##
rm /Users/vivek/!(*.zip|*.iso|*.mp3)

## 也可以传递参数 ##
rm [选项]  !(*.zip|*.iso)
rm -v  !(*.zip|*.iso)
rm -f  !(*.zip|*.iso)
rm -v -i  !(*.php)

最后,关闭 extglob 选项方法如下:

shopt -u extglob

策略 #2: 使用bash的 GLOBIGNORE 变量删除指定文件以外的所有文件

摘自 bash(1) 手册页:

这是一个用冒号分开的模式列表,通过路径展开方式定义了要忽略的文件集合。如果一个匹配到路径展开模式的文件也匹配GLOBIGNORE中的模式,那么它会从匹配列表中移除。

要删除所有文件只保留 zip 和 iso 文件,应如下设置 GLOBIGNORE:

## 只在 BASH 中可行 ##
cd ~/Downloads/
GLOBIGNORE=*.zip:*.iso
rm -v *
unset GLOBIGNORE

策略 #3: 用 find 命令删除所有其它文件仅保留 zip 和 iso 文件

如果你正在使用 tcsh/csh/sh/ksh 或者其它shell,你可以在Unix-like系统上试着用下面find命令的语法格式来删除文件:

find /dir/ -type f -not -name '匹配模式' -delete

或者

## 对于怪异的文件名可以使用 xargs ##
find /dir/ -type f -not -name '匹配模式' -print0 | xargs -0 -I {} rm {}
find /dir/ -type f -not -name '匹配模式' -print0 | xargs -0 -I {} rm [选项] {}

想要删除 ~/source 目录下除 php 以外的文件,键入:

find ~/sources/ -type f -not -name '*.php' -delete

或者

find ~/sources/ -type f -not -name '*.php' -print0 | xargs -0 -I {} rm -v {}

只保留 *.zip 和 *.iso 文件的语法如下:

find . -type f -not \( -name '*zip' -or -name '*iso' \) -delete

更多信息参见bash command man pagefind command man page


via: http://www.cyberciti.biz/faq/linux-bash-delete-all-files-in-directory-except-few/

译者:Linchenguang 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

以前我总想知道如何为我的Bash脚本创建命令行参数。经过搜索,我发现了2个函数可以处理这个问题,getopt 函数和 getopts 函数。我无意争论哪一个函数更好的。getopts 是一个shell内建命令,而且似乎比 getopt 更容易实现这个功能,所以在这篇文章里我准备讲讲getopts。

bash getopts

开始的时候,我只试着处理传递给脚本的命令行参数。最后,我添加了另外一些有用的功能函数,使得这个脚本可以成为其他任何交互式脚本处理命令行的开始模板。我还添加了一个纯文本格式的帮助函数,让脚本更加容易阅读。

与其来一长段文字解释 getopts 在bash中是如何工作的,我认为不如直接来一个能工作的脚本更让人觉得轻松一些。

#!/bin/bash

######################################################################
#This is an example of using getopts in Bash. It also contains some
#other bits of code I find useful.
#Author: Linerd
#Website: http://tuxtweaks.com/
#Copyright 2014
#License: Creative Commons Attribution-ShareAlike 4.0
#http://creativecommons.org/licenses/by-sa/4.0/legalcode
######################################################################

#Set Script Name variable
SCRIPT=`basename ${BASH_SOURCE[0]}`

#Initialize variables to default values.
OPT_A=A
OPT_B=B
OPT_C=C
OPT_D=D

#Set fonts for Help.[译注: 这里tput用来更改终端文本属性,比如加粗,高亮等]
NORM=`tput sgr0`
BOLD=`tput bold`
REV=`tput smso`

#Help function
function HELP {
  echo -e \\n"Help documentation for ${BOLD}${SCRIPT}.${NORM}"\\n
  echo -e "${REV}Basic usage:${NORM} ${BOLD}$SCRIPT file.ext${NORM}"\\n
  echo "Command line switches are optional. The following switches are recognized."
  echo "${REV}-a${NORM}  --Sets the value for option ${BOLD}a${NORM}. Default is ${BOLD}A${NORM}."
  echo "${REV}-b${NORM}  --Sets the value for option ${BOLD}b${NORM}. Default is ${BOLD}B${NORM}."
  echo "${REV}-c${NORM}  --Sets the value for option ${BOLD}c${NORM}. Default is ${BOLD}C${NORM}."
  echo "${REV}-d${NORM}  --Sets the value for option ${BOLD}d${NORM}. Default is ${BOLD}D${NORM}."
  echo -e "${REV}-h${NORM}  --Displays this help message. No further functions are performed."\\n
  echo -e "Example: ${BOLD}$SCRIPT -a foo -b man -c chu -d bar file.ext${NORM}"\\n
  exit 1
}

#Check the number of arguments. If none are passed, print help and exit.
NUMARGS=$#
echo -e \\n"Number of arguments: $NUMARGS"
if [ $NUMARGS -eq 0 ]; then
  HELP
fi

### Start getopts code ###

#Parse command line flags
#如果选项需要后跟参数,在选项后面加":"
#注意"-h"选项后面没有":",因为他不需要参数。选项字符串最开始的":"是用来去掉来自getopts本身的报错的,同时获取不能识别的选项。(译注:如果选项字符串不以":"开头,发生错误(非法的选项或者缺少参数)时,getopts会向错误输出打印错误信息;如果以":"开头,则不会打印[在man中叫slient error reporting],同时将出错的选项赋给OPTARG变量)

while getopts :a:b:c:d:h FLAG; do
  case $FLAG in
    a)  #set option "a"
      OPT_A=$OPTARG
      echo "-a used: $OPTARG"
      echo "OPT_A = $OPT_A"
      ;;
    b)  #set option "b"
      OPT_B=$OPTARG
      echo "-b used: $OPTARG"
      echo "OPT_B = $OPT_B"
      ;;
    c)  #set option "c"
      OPT_C=$OPTARG
      echo "-c used: $OPTARG"
      echo "OPT_C = $OPT_C"
      ;;
    d)  #set option "d"
      OPT_D=$OPTARG
      echo "-d used: $OPTARG"
      echo "OPT_D = $OPT_D"
      ;;
    h)  #show help
      HELP
      ;;
    \?) #unrecognized option - show help
      echo -e \\n"Option -${BOLD}$OPTARG${NORM} not allowed."
      HELP
      #在这里如果你不想打印完整的帮助信息,只想显示简单的错误信息,去掉上面的两行,同时使用下面的两行。
      #echo -e "Use ${BOLD}$SCRIPT -h${NORM} to see the help documentation."\\n
      #exit 2
      ;;
  esac
done

shift $((OPTIND-1))  #This tells getopts to move on to the next argument.

### End getopts code ###


### Main loop to process files ###

#这里你可以用你的脚本处理逻辑来替代。这个例子只是在终端中打印文件的文件名和后缀名。你可以把任意其他的文件处理任务放到这个while-do循环中。   

while [ $# -ne 0 ]; do
  FILE=$1
  TEMPFILE=`basename $FILE`
  #TEMPFILE="${FILE##*/}"  #另外一种获取不带后缀的文件名的方法。
  FILE_BASE=`echo "${TEMPFILE%.*}"`  #file without extension
  FILE_EXT="${TEMPFILE##*.}"  #file extension


  echo -e \\n"Input file is: $FILE"
  echo "File withouth extension is: $FILE_BASE"
  echo -e "File extension is: $FILE_EXT"\\n
  shift  #Move on to next input file.
done

### End main loop ###

exit 0

将上面的代码复制到你的文本编辑器里,然后保存到你的可执行路径下。我将这个脚本命名为 options 并保存到 /home/linerd/bin 路径下。保存之后记得给你的脚本添加可执行权限。

chmod +x ~/bin/options

现在脚本已经可以运行了。试试用 -h 参数来打印帮助信息吧。

options -h

遇到不支持的选项,脚本同样可以给出提示,并打印帮助信息。

options -z

最后,getopts可以以任意的顺序处理你给的命令行参数。唯一的限制是你要处理的文件必须放在所有参数的最后。

options -d bar -c chu -b man -a foo example1.txt example2.txt

现在你可以从这些例子里看到如何通过命令行参数给脚本里的变量赋值。这个脚本里除了getopts还有很多其他的东西,但是我认为这些就足以成为一个新脚本的开头模板了。如果你有兴趣更深入地学习bash的getopts,你可以找找深埋在man page的“Builtins”这一节里的文档,也可以从 Bash Reference Manual 找到信息。

接下来呢?

你会用getops来干什么呢?在评论里告诉我吧。


via: http://tuxtweaks.com/2014/05/bash-getopts/

译者: CNprober <[email protected], QQ619913541> 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux 和 Unix 属于多任务的操作系统,也就是说一个系统在同一时间段内能运行多重任务(进程)。在这个新的博客系列,我将会列出相关的 Linux 和 Unix 作业(job)控制的命令,你可以通过这些命令在 Bash 或 Korn 还有 POSIX shell 下实现执行多重任务。

什么是作业控制?

作业控制不只是能够停止/挂起(stop/suspend)正在执行的进程(命令),也可以继续/唤醒(continue/resume)执行你需要的每一个进程。这完全可以用你的操作系统和 bash/ksh 之类的 shell 或 POSIX shell 完成。

谁给作业控制的提供了环境?

Bash / Korn shell,或者是 POSIX shell 提供给了作业控制的环境。

跟作业表打个招呼吧

你的 shell 会留有一张当前作业的表单,称为作业表。当你键入命令时,shell 会给它分配一个 jobID(也称作 JOBSPEC)。一个 jobID 或 JOBSPEC只是很小的整数数值。

1: 创建你的首个 Linux/Unix 作业

我要运行一个名为 xeyes 的命令,它会在屏幕上显示两个椭圆的眼睛,输入: $ xeyes &

输出样例:

Fig.01: 在后台运行 xeyes 命令

我使用&符号让一个 job 在后台运行。shell 会打印一行信息类似如下:

[1] 6891

在这个例子中,有两个数字输出,分别表示:

  • 1 : 在后台执行的 xeyes 任务的作业号为 1。
  • 6891 : 作业1的进程ID。

我在多执行一些 job:

## 启动一个文本编辑器,X 的系统负载显示,和 sleep 命令 ##
gedit /tmp/hello.c &
xload &
sleep 100000 &

2: 列出当前的作业

查看当前 shell 的激活的任务状态,输入:

$ jobs
$ jobs -l

输出如下:

[1]   9379 Running                 xeyes &
[2]   9380 Running                 gedit /tmp/hello.c &
[3]-  9420 Running                 xload &
[4]+  9421 Running                 sleep 100000 &

简要描述如下:

字段描述示例
1[1]jobIDJOB\_SPEC - 工作号要与fg, bg, wait, kill和其他shell命令一起使用。你必须在工作号前缀添加一个百分号:(**%**)。加号 (+) 标识着默认的或是现在的作业。减号 (-) 标识着前一个作业。%1`fg %1`kill %2
29379进程 ID - 系统自动为每个进程创建并分配地独有的身份标志号。kill 9379
3Running状态 - 关于作业的状态:**Running** - 该 作业正在运行,还没有被外部信号挂起。**Stopped** - 该作业已经被挂起。N/A
4xeyes &command - 由shell给出的命令。script &firefox url&

你也可以用 ps 命名列出当前系统正在运行的进程:

$ ps

3: 停止或挂起正在运行的作业

按下[Ctrl]-[Z]键或使用kill 命令,如下所示:

kill -s stop PID

举个例子,启动ping 命令,然后用 Ctrl-Z 键来停止 ping 命令作业:

Animated gif 01: 挂起 ping 命令作业

4: 在前台恢复 挂起的/停止的作业

让我们恢复处于停止状态下的作业,让它回到前台继续运行,要将其变成当前作业,必须借助fg 命令。具体语法如下:

## ping 命令的作业号的值为5 ##
fg %5

我也可以规定命令行开端符合字符串"ping"的作业[译注:不能出现不明确的字符串,例如如果后台有两个 vim 进程而你敲入 fg %vim 会报错。]:

## %String ##
fg %ping

输出样例:

64 bytes from www.cyberciti.biz (75.126.153.206): icmp_req=3 ttl=53 time=265 ms
64 bytes from www.cyberciti.biz (75.126.153.206): icmp_req=4 ttl=53 time=249 ms
64 bytes from www.cyberciti.biz (75.126.153.206): icmp_req=5 ttl=53 time=267 ms
^C

5: 在后台恢复 挂起/停止状态的作业

在这个例子中,我使用yum 命令更新所有安装在 Redhat 或 CentOS Linux 生产服务器上的软件包并置于后台作业。

# yum -y update &>/root/patch.log &

然而,由于一些原因(例如,过载问题)我决定停止这个作业20分钟:

# kill -s stop %yum

输出样例:

[7]+  Stopped                 yum -y update &>/root/patch.log &

用 bg 重启停止在后台的 yum 进程

现在,我将要恢复停止的 yum -y update &>/root/patch.log & 作业,键入:

# bg %7

或者:

# bg %yum

输出样例:

[7]+ yum -y update &>/root/patch.log &

6: 杀死作业/进程

杀死yum 命令进程,输入如下kill 命令及其作业号 7:

# kill %7

或者

# kill 进程ID

输出样例:

[7]+  Terminated              yum -y update &>/root/patch.log &

在 Linux/FreeBSD/OS X Unix 下你也可以使用 killall 命令通过名字杀死进程或是 jobID 而不是通过 PID

7 为什么当我登出后 shell 会清除我的所有后台作业

在这个例子中,我将会启动 pdfwriter.py 来批量生成这个站点的 pdf 文件:

~/scripts/www/pdfwriter.py --profile=faq --type=clean --header=logo\
--footer-left "nixCraft is GIT UL++++ W+++ C++++ M+ e+++ d-" \
--footer-right "Page [of] of [total]" &

一旦当我登出shell时,pdfwriter.py 作业就会被我的 shell 杀死。为了克服这个问题需要使用shell的内置命令 disown 来告诉 shell 不要发送 HUP 信号,键入:

$ ~/scripts/www/pdfwriter.py --profile=faq .... &
$ disown
$ exit

8 使用一个名为 nohup 的外部命令阻止在登出时杀死作业

你也可以使用nohup 命令在你退出 shell 后执行作业:

$ nohup ~/scripts/www/pdfwriter.py --profile=faq .... &
$ exit

9: 查找最后的作业的 PID

为了查找最近在后台执行的(异步)命令的进程ID,可使用 bash shell 的特殊参数 $!

$ gedit foo.txt &
$ echo "最近在后台执行的job 的PID - $!" 

输出样例:

最近在后台执行的job 的PID - 9421

10: 等候作业完成

wait 命令会等候给予的进程ID 或 作业ID指定的进程,然后报告它的终止状态。语法如下:

/path/to/large-job/command/foo &
wait $!
/path/to/next/job/that-is-dependents/on-foo-command/bar

这是我的一个工作脚本:

#!/bin/bash
# A shell script wrapper to create pdf files for our blog/faq section
########################################################################
# init() - Must be run first 
# Purpose - Create index file in $_tmp for all our wordpress databases 
########################################################################
init(){
 _php="/usr/bin/php"
 _phpargs="-d apc.enabled=0"
 _base="~/scripts"
 _tmp="$_base/tmp"
 _what="$1"
 for i in $_what
 do
        [[ ! -d "$_tmp/$i" ]] && /bin/mkdir "$_tmp/$i"
        $_php $_phpargs -f "$_base/php/rawsqlmaster${i}.php" >  "$_tmp/$i/output.txt"
 done
}

#####################################################
# Without index file, we can out generate pdf files
#####################################################
init blog

###########################################################
# Do not run the rest of the script until init() finished
###########################################################
wait $!

## Alright, create pdf files 
~/scripts/www/pdfwriter.py --profile=blog --type=clean --header=logo\
--footer-left "nixCraft is GIT UL++++ W+++ C++++ M+ e+++ d-" \
--footer-right "Page [of] of [total]"

Linux 和 Unix 作业控制命令总结列表

命令描述示例
**&**将作业置入后台命令 &
**%n**设置作业号为 n (数字)的作业命令 %1
**%Word**引用命令行开端包含 Word 的作业命令 %yum
**%?Word**引用命令行包含 Word 的作业命令 %?ping
**%%**`%+`引用当前作业kill %%kill %+
**%-**引用先前作业bg %-
**CTRL-Z**kill -s stop jobID``挂起或停止作业kill -s stop %ping
**jobs**jobs -l``列出活动的作业jobs -l
**bg**将 作业置入后台bg %1bg %ping
**fg**将作业置入前台fg %2fg %apt-get

关于 shell 内置命令和外部命令的小注

运行下面的 type 命令找出给予命令是否属于内部或外部的。

type -a fg bg jobs disown

输出样式:

fg is a shell builtin
fg is /usr/bin/fg
bg is a shell builtin
bg is /usr/bin/bg
jobs is a shell builtin
jobs is /usr/bin/jobs
disown is a shell builtin

在几乎所有情况下,你都需要使用 shell 的内置命令。所有外部命令例如 /usr/bin/fg 或 /usr/bin/jobs 工作在一个不同的 shell 环境下,而不能用在父 shell 的环境下。

总结

我希望你能喜欢这篇博文系列(rss 订阅),我建议你阅读下面的更多信息:

我会计划在这个系列添加更多深入的教程。若果你需要看到具体的主题,请在下方评论让我知道。


via: http://www.cyberciti.biz/howto/unix-linux-job-control-command-examples-for-bash-ksh-shell/

译者:Luoxcat 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我们时不时给你带来关于Linux的提示与技巧。和这个系列保持一致,这里有8个我们从读者收到最有趣的提示和技巧。我们希望你喜欢它。请继续读下去。。。

以它们的大小列出文件

如果你想要一个基于它们大小排序的文件列表,你可以使用下面的命令。

它会以递减顺序排列文件。

# ls -l | grep ^- | sort -nr -k 5 | more

如果你想要递归地做相同的事,你可以使用下面的第二个命令。

# ls -lR | grep ^- | sort -nr -k 5 | more

—Sumedh Gajbhiye, [email protected]

重置奇怪的终端

如果感觉你的bash终端错误地显示垃圾的提示字符信息,并无论你输入任何命令都显示非ASCII字符-下面的命令可以让事情回到正轨。

在终端盲打输入(译注:因为你其实看不到你输入的这些字符的正确显示,不过尽管输入好了!)下面的命令并按回车:

# reset

如果那个不能修复这个问题,试一下下面的:

# stty sane

—Sudheer Divakaran, [email protected]

记录并回放终端会话

下面是一个简单的贴士来记录并回放终端回放。它通过使用命令script和scriptreplay。

这在使用终端制作教程时非常方便。

要开始记录你的终端会话,使用下面的命令:

$ script -t 2> timing.log -a output.session

接着输入:

$ ls
$touch test
.....

$ exit

这里,script命令取两个文件作为参数timing.log(它记录了每个命令执行的时间信息)和output.session(存储了命令的输出)。

现在,要回访记录的会话,使用下面所示的scriptplay。

$ scriptreplay timing.log output.session

注:timing.log和output.session可以被任何想要在自己的终端上重放会话的人使用。

—Abhishek Singh, [email protected]

使用shell脚本生成随机数

有时当你想要用shell脚本编程时,可能需要生成一个随机数来用于脚本。

这里是获得一个3位随机数的代码。

var=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d” “ | cut -c 3-5);

这回存储随机生成的数字在名为var的变量中。

—Arpan Chavda, [email protected]

以root用户运行Linux上的软件

作为一名root用户,为了让某些不能在root身份运行的软件运行(译注:典型的是google chrome),你需要在软件的二进制文件中改变geteuid调用为getppid。

这个技术在操作系统中非常有用,比如backtrack,这里的大多数安装工作都以root用户完成。

比如:为了以root用户运行Google Chrome,使用下面的命令:

# hexedit /opt/google/chome/chrome

接着按下Ctrl+S并在16进制转储文件中搜寻geteuid字符串。用字符串getppid代替。按下Ctrl+X来保存并退出编辑器。

现在浏览器就可以以root用户运行了。

# google-chrome

—Mayank Bhanderi, [email protected]

用gzip压缩优化你的站点

压缩是一种简单、有效的方法来节约带宽和加速你的站点。在压缩的帮助下,多数站点的主页面会从100KB变成10KB。

为了在Apache Web服务器中启用这个特性,你需要在httpd.conf中包含deflate\_module,并且在Apache配置文件中加入下面的行 (/etc/httpd/conf/httpd.conf)来压缩text、html、 javascript、 css 和 xml 文件:

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

—Munish Kumar, [email protected]

在登陆时检查服务器负载信息

这里有一个贴士来在你登陆服务器的时候检查服务器平均负载。创建一个sload.sh的文本文件,内容如下:

#!/bin/bash
gh=$(uptime | awk -F, ‘{print $3}’)
echo -e “Server$gh\n”

现在,为了在登陆时检查服务器负载,通过/root/.bashrc调用sload.sh脚本。

记住如下设置脚本权限:

# chmod 755 /root/sload.sh

要调用sload.sh脚本,如下在/root/.bashrc后追加

/root/sload.sh

或者你还可以这样追加sload.sh的内容到.bashrc中。

$echo “/root/sload.sh” >> /root/.bashrc

当你完成上面的步骤后,你可以登出并再次登陆来查看服务器负载。

—Ranjith Kumar T, [email protected]

在特定时间开始你的任务

你可以使用下面的命令来在特定时间调度你的作业:

# at 2015

> >vlc /music/rockstar.mp3

这个命令会在2015小时后使用vlc播放器播放rockstar.mp3。你可以在at命令后跟上-l选项来检查挂起的作业:

# at -l

更多at命令的信息可以在man页找到。

—Manas Pradhan, [email protected]


via: http://www.efytimes.com/e1/fullnews.asp?edid=127250

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我日常使用Linux shell(Bash),但是我经常忘记一些有用的命令或者shell技巧。是的,我能记住一些命令,但是肯定不会只在特定的任务上使用一次,所以我就开始在我的Dropbox账号里用文本文件写下这些Linux shell的小技巧,现在我决定共享它给你。这个表我以后还会更新。记住,这里的一些贴士需要在你的Linux发行版上安装额外的软件。

在bash中检查远程端口是否打开:

echo >/dev/tcp/8.8.8.8/53 && echo "open"

将进程挂起:

Ctrl + z 

将进程移到前台:

fg

(译注,挂起的进程是不执行的,如果希望在后台执行,可以使用bg命令,并且指定通过jobs命令获得的任务号。)

生成随机16进制数字,n是字符的数量:

openssl rand -hex n

在当前shell中执行一个文件中的命令(译注:这个文件不是一个bash脚本,比如.bashrc、bash\_profile等):

source /home/user/file.name

提取字符串的前5个字符:

${variable:0:5}

打开SSH调试模式(译注:当你遇到SSH连接问题时很有用):

ssh -vvv user@ip_address

使用pem key的进行SSH连接:

ssh user@ip_address -i key.pem

用wget获取完整目录列表到本地目录:

wget -r --no-parent --reject "index.html*" http://hostname/ -P /home/user/dirs

同时创建多个目录:

mkdir -p /home/user/{test,test1,test2}

以树状列出进程及子进程:

ps axwef

创建war文件:

jar -cvf name.war file

测试磁盘写速度:

dd if=/dev/zero of=/tmp/output.img bs=8k count=256k conv=fdatasync; rm -rf /tmp/output.img

测试磁盘读速度:

hdparm -Tt /dev/sda

获取文本的md5值:

echo -n "text" | md5sum

检测xml语法:

xmllint --noout file.xml

将tar.gz文件解压到指定目录:

tar zxvf package.tar.gz -C new_dir

用curl获取HTTP头:

curl -I http://www.example.com

修改一些文件或目录的时间戳 (格式为:YYMMDDhhmm):

touch -t 0712250000 file

使用wget从ftp下载:

wget -m ftp://username:password@hostname

生成随机密码 (本例中16位字符长):

LANG=c < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;

快速创建一个文件的备份(扩展名是.bkp):

cp some_file_name{,.bkp}

访问Windows共享:

smbclient -U "DOMAIN\user" //dc.domain.com/share/test/dir

运行history中的命令 (这里在history中的第100个):

!100

unzip到目录中:

unzip package_name.zip -d dir_name

输入多行文字 (按 CTRL + d 退出):

cat > test.txt

创建空白的文件或者清空已存在的文件:

> test.txt

从Ubuntu NTP服务器上更新日期:

ntpdate ntp.ubuntu.com

netstat 显示所有IPv4的TCP监听的端口:

netstat -lnt4 | awk '{print $4}' | cut -f2 -d: | grep -o '[0-9]*'

将qcow2的镜像转化成raw格式:

qemu-img convert -f qcow2 -O raw precise-server-cloudimg-amd64-disk1.img \
                                 precise-server-cloudimg-amd64-disk1.raw

重复运行命令并显示它的输出 (默认2秒重复一次):

watch ps -ef

显示所有用户:

getent passwd

以读写模式挂载根文件系统:

mount -o remount,rw /

挂载目录 (适合于符号链接不能工作的情况下):

mount --bind /source /destination

发送DNS动态更新给DNS:

nsupdate <

递归grep所有目录

grep -r "some_text" /path/to/dir

列出10个最大的系统中已打开的文件:

lsof / | awk '{ if($7 > 1048576) print $7/1048576 "MB "$9 }' | sort -n -u | tail

以MB显示空余内存:

free -m | grep cache | awk '/[0-9]/{ print $4" MB" }'

打开vim并跳转到文件最后:

vim + some_file_name

git clone特定branch (本例是master分支):

git clone [email protected]:name/app.git -b master

git切换到另外一个branch (本例是develop分支):

git checkout develop

git删除一个branch(本例是myfeature):

git branch -d myfeature

Git删除一个远程branch:

git push origin :branchName

Git push 新的branch到远程:

git push -u origin mynewfeature

打印history中最后的cat命令

!cat:p

运行history中的最后的cat命令:

!cat

找出在/home/user中的所有空子目录:

find /home/user -maxdepth 1 -type d -empty

得到test.txt中50到60行的文本:

< test.txt sed -n '50,60p'

以sudo权限重新运行上一个执行的命令 (如果是: mkdir /root/test, 下面会运行: sudo mkdir /root/test)(译注:当你执行一个命令忘记sudo时,可以这样重新执行,而不必再把完整命令敲一遍):

sudo !!

创建临时RAM文件系统 - ramdisk (请先创建 /tmpram 目录):

mount -t tmpfs tmpfs /tmpram -o size=512m

Grep完整的单词(译注:而不是其它单词的一部分):

grep -w "name" test.txt

提升权限后在一个文件后追加文本:

echo "some text" | sudo tee -a /path/file

列出所有支持的kill信号:

kill -l

生成随机密码 (本例中16个字符长):

openssl rand -base64 16

在bash历史中不记录最后的会话:

kill -9 $$

扫描网络来找出开放的端口:

nmap -p 8081 172.20.0.0/16

设置git email:

git config --global user.email "[email protected]"

如果你有未提交的commit,与master同步:

git pull --rebase origin master

将文件名中含有txt的所有文件移动到/home/user:

find -iname "*txt*" -exec mv -v {} /home/user \;

按行将两个文件中的对应行合并显示:

paste test.txt test1.txt

shell中的进度条:

pv data.log

用netcat发送数据给服务器:

echo "hosts.sampleHost 10 `date +%s`" | nc 192.168.200.2 3000

转换tab为空格:

expand test.txt > test1.txt

跳过bash历史:

<<空格>>cmd

回到之前的工作目录:

cd -

切割大的tar.gz文件为几个文件 (每个100MB),并还原:

split –b 100m /path/to/large/archive /path/to/output/files
cat files* > archive

用curl获取HTTP状态值:

curl -sL -w "%{http_code}\\n" www.example.com -o /dev/null

当 Ctrl + c 没用时:

Ctrl + \

获取文件所有者:

stat -c %U file.txt

列出块设备:

lsblk -f

找出文件中带有末尾空格的文件:

find . -type f -exec egrep -l " +$" "{}" \;

找出用tab缩进的文件:

find . -type f -exec egrep -l $'\t' "{}" \;

用"="打印水平行

printf '%100s\n' | tr ' ' =

更新: 2013年11月25日


via: http://www.techbar.me/linux-shell-tips/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

最新的GNOME Shell 3.10 beta测试版已经在几天前提供下载,这也带来了很多改进并修复了很多bug。

GNOME Shell 3.10 Beta2 改进了子菜单的风格,调整了系统活动区的风格,并且为“无需用户名”验证提供支持,实现了新的“关机/结束”当前登录会话的对话框设计,对一些独立的Wayland和X11的二进制代码的编译进行了改善。

这个版本也使界面上的滑块更易访问,你将可以通过键盘改变滑块的数值。Dash的帮助提示将不在那些弹窗的应用程式启动时显示,调整了系统状态图标间的空白距离,改善了日历的键盘导航功能和易用性。

这个版本是3.10的第二个beta测试版,它支持新的NetworkManager API,系统活动区在锁屏时候会被隐藏,其他登陆的用户在登出后就会被隐藏,而且“Session“这个大大的标题也将从登陆界面中被移除。

还有Dash已经能在安装的程序改变时候重新载入“最喜爱的程式”(favorites);关闭工作区的最后一个窗口后,预览模式也将不再被打开;增加了Focus App的DBus模式;设计了一个新的程序选择器;换页的那部分可点击的按钮区域被扩展延伸了;修正了显示消息时候移动的控制栏。

感谢Ray、Clovanni、Jasper、Emmamuele的努力,消除了GNOME Shell 3.10 Beta2中的以下几个bug:#706542、 #706654、 #706005、 #706681、 #706841,、#706843、 #707064、 #706262、 #707197 和 #707269。 你可以在GNOME的Bugzillla的网站中找到它们的说明(当然,不要加#咯)。

这个版本中的翻译的进度中,已经有了波兰语、挪威语(波克默尔语)、塔吉克语、 葡萄牙语(巴西)、德语、立陶宛语、加利西亚语(西班牙)、斯洛伐克语、斯洛文尼亚语、加泰罗尼亚语、比利时语。更多具体的细节请查看官方的更新说明文档

也可以直接从Softpedia下载GNOME Shell 3.10 Beta2,但请谨记这只是一个beta测试版。请不要在生产环境中安装。这个版本只供测试使用。

原文链接: http://news.softpedia.com/news/GNOME-Shell-3-10-Beta-2-Implements-New-System-Status-Area-380916.shtml

本文由 LCTT 原创翻译,Linux中国 荣誉推出

译者:Chilledheart 校对:wxy