Ubuntu常用命令

更新源

Ubuntu 的软件源配置文件是 /etc/apt/sources.list

1
2
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak  # 更新源前,先备份一份源
sudo vim /etc/apt/sources.list # 更改源配置文件

再文件末尾添加如下源:

1
2
3
4
5
6
7
8
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

然后控制台输入命令更新系统:

1
2
sudo apt-get update
sudo apt-get upgrade

移除软件或库

1
2
# 删除 LibreOffice 软件
sudo apt-get remove libreoffice-common

安装命令

1
2
3
4
# 官网下载sogo安装包,然后用命令行安装sogo拼音输入法
sudo dpkg -i sogoupinyin_2.1.0.0082_amd64.deb
# 如果提示依赖有问题,执行下面命令后重新安装:
sudo apt-get install -f
1
2
# 安装git
sudo apt-get install git

解压命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 如安装Jdk时,我们使用tar命令进行解压
# 首先到Oracle官网下载JDK8,下载地址如下::http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
# 安装命令如下:
sudo mkdir /usr/lib/jvm ## 新建一个文件夹
sudo cp ./jdk-8u112-linux-x64.tar.gz /usr/lib/jvm/ ## 复制命令
cd /usr/lib/jvm
sudo tar -zxvf jdk-8u91-linux-x64.tar.gz ## 解压命令

# 上述命令将 jdk-8u112-linux-x64.tar.gz 解压到了 /usr/lib/jvm 目录下,
# 然后在下面 /etc/profile文件中配置变量:
sudo gedit /etc/profile

# 在文件末尾追加:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_112
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# 执行下面命令使当前bash环境生效:
source /etc/profile

# 查看是否安装成功:
java -version

添加环境变量

参考:http://www.powerxing.com/linux-environment-variable/

设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别。

通过文件设置 Linux 环境变量

首先是设置全局环境变量,对所有用户都会生效:

  • etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。
  • /etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端 shell,该文件就会被读取。

接着是与上述两个文件对应,但只对单个用户生效:

  • ~/.bash_profile 或 ~/.profile: 只对单个用户生效,当用户登录时该文件仅执行一次。用户可使用该文件添加自己使用的 shell 变量信息。另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是 ~/.bash_profile, ~/.bash_login 或 ~/.profile 其中的一种或几种,如果存在几种的话,那么执行的顺序便是:~/.bash_profile、 ~/.bash_login、 ~/.profile。比如 Ubuntu 系统一般是 ~/.profile 文件。

  • ~/.bashrc: 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。

然后需要使用 source 命令,使当前配置的环境变量生效:

1
source ~/.bashrc

  • 此外,修改 /etc/environment 这个文件也能实现环境变量的设置。/etc/environment 设置的也是全局变量,从文件本身的作用上来说, /etc/environment 设置的是整个系统的环境,而/etc/profile是设置所有用户的环境。有几点需注意:

  • 系统先读取 etc/profile 再读取 /etc/environment(还是反过来?)
  • /etc/environment 中不能包含命令,即直接通过 VAR="..." 的方式设置,不使用 export 。
  • 使用 source /etc/environment 可以使变量设置在当前窗口立即生效,需注销/重启之后,才能对每个新终端窗口都生效。

修改 Linux 环境变量实例

以 Ubuntu 为例,修改 ~/.profile 文件:

1
vim ~/.profile

如果该文件存在,则在文件的最后看到如下代码,PATH 变量的值使用冒号(:)隔开的:

1
2
3
4
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi

在最后加上代码 PATH="$PATH:/usr/local/hadoop/bin",注意等号(=)两边不要有空格,即:

1
2
3
4
5
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
PATH="$PATH:/usr/local/hadoop/bin"

因为这个文件是在用户登陆是才读取一次的,所以需要重启才会生效(修改 /etc/profile、/etc/environment 也是如此)。但可以使用命令 source ./.profile 使其立即生效。通过 echo $PATH 可以看到修改后的变量值:

1
source ./.profileecho $PATH

通过 Shell 命令 export 修改 Linux 环境变量

另一种修改 Linux 环境变量的方式就是通过 Shell 命令 export,注意变量名不要有美元号 $,赋值语句中才需要有:

1
export PATH=$PATH:/usr/local/hadoop/bin

export 方式只对当前终端 Shell 有效

使用 export 设置的变量,只对当前终端 Shell 有效,也就是说如果新打开一个终端,那这个 export 设置的变量在新终端中使无法读取到的。适合设置一些临时变量。

根据变量所需,选择设置方式,例如 JAVA_HOME 这类变量,就适合将其设为为全局变量,可在 /etc/environment 中设置。

设置权限

参考:http://blog.csdn.net/flyingflame/article/details/1652458

将目前目录下的所有档案与子目录皆设为任何人可读取 :

1
chmod -R a+r *

将目前目录下的所有档案与子目录皆设为任何人可可读可取可写:

1
chmod -R 777 *

后台管理

nohup 后台运行

自己常用的后台开启shadowsocks

1
nohup sh shadow.sh  &

查看后台进程

1
jobs -l

将后台切换到当前运行

1
bg %` # 将进程好为1的后台程序设置到当前运行

Ctrl + Z 暂停当前进程

然后可以通过使用

1
2
jobs -l 	# 查看当前进程
bg %1 # 将暂停的进程切换到当前进程

kill 杀死当前进程

1
kill %1    # 杀死进程号为1的进程

Vim常用命令

  • ZZ 保存
  • U 返回
  • . 前进
  • i O 插入

Vim 全选复制删除

全部删除:按esc键后,先按gg(到达顶部),然后dG
全部复制:按esc键后,先按gg,然后ggyG
全选高亮显示:按esc键后,先按gg,然后ggvG或者ggVG

单行复制:按esc键后, 然后yy
单行删除:按esc键后, 然后dd
粘贴 :按esc键后, 然后p

解析:

set nu: 显示行号

H J K L : 左 ,下, 上, 右

gg:是让光标移到首行,在vim才有效,vi中无效

v : 是进入Visual(可视)模式

G :光标移到最后一行

5G : 移动到第5行

选中内容以后就可以其他的操作了,比如:
d 删除中内容
y 复制中内容到0号寄存器
**“+y** 复制中内容到+寄存器,也就是系统的剪贴板,供其他程序用

vim只能粘贴50行的问题:

在当前用户主目录()编辑/.vimrc(如果不存在,新建这个文件),添加一行

1
:set viminfo='1000,<500

至于为什么要输入输入’1000,这个其实不重要,最主要的是输入<500,它是设置寄存器保存的行数的。即最大值为 500

文件搜索:find 命令

通用格式: find pathname -options [-print -exec -ok]

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
find / -name filename 		# 再根目录里面搜索文件名为filename的文件
find /etc -name *s* # 在目录里面搜索带有s的文件
find /etc -name *S # 在目录里面搜索以s结尾的文件
find /etc -name s* # 在目录里面搜索以s开头的文件
find / -amin -10 # 在系统中搜索最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者是文件夹
find / -group groupname # 查找在系统中属于groupname的文件
find / -mmin -5 # 查找在系统中最后5分钟修改过的文件
find / -mtime -1 # 查找在系统中最后24小时修改过的文件
find / -nouser # 查找在系统中属于费用户的文件
find / -user username # 查找在系统中属于username的文件
find / -ctime -1 # 查找在系统中最后24小时被改变状态的文件
find / -fstype type # 查找在系统中文件类型为?的文件
find / -user user1name -or -useruser2name # 查找在系统中属于user1name或着属于user2name的文件
find / -user user1name -and-user2name # 在系统中查找既属于user1name又属于user2name用户的文件.

关键字搜索:grep

例如:再src/caffe/layer_factory.cpp 中有个宏调用: REGISTER_LAYER_CREATOR(Pooling, GetPoolingLayer); 可以用过grep 命令查看这个宏到底干了什么,再caffe根目录下运行一下命令:

1
grep -n -H -R "REGISTER_LAYER_CREATOR"

命令行参数解释:

参数 作用
-n 显示行号,便于定位
-H 显示文件名,便于定位
-R 递归查找每个子目录,视乎工程较大、分多个目录存放的场景

查看端口是是否被占用

  • lsof
1
lsof -i  # 端口号查看某个端口是否被占用
  • netstat
1
netstat -anp|grep 80   # 查看80端口是否被占用

多文件替换字符

  • sed xargs

比如我们要替换掉所有标签文件中标错了的标签,将>race 替换为 >trace,具体使用方法如下:

1
2
3
4
grep ">rack" -rl /home/lly/test/* | xargs sed -i "s/>rack/>track/g"
# >rack :表示我们需要替换的字符串
# /home/lly/test/* :表示我们需要将这个目录先所有文件进行这样的操作
# "s/>rack/>track/g""s/原字符串/新的字符串/g"

性能分析

  • top

查看资源占用情况

1
2
3
top 
# 然后可以通过按键盘 'x' 高亮显示当前排序的列,默认按CPU占用情况排序
# 接着可以通过使用键盘 shift + < ,或者 shift + > 来转移列排序

reference: http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html

释放内存

  • free

查看内存使用情况

1
2
3
4
5
6
7
8
9
10
free -h
# 每隔一秒查看内存变化情况
watch -n 1 free -m
# This command will also display in real-time your system memory usage:
watch -n 1 cat /proc/meminfo

# 释放未使用的内存:
sudo sysctl -w vm.drop_caches=3
# free up memory either used or cached (page cache, inodes, and dentries):
sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Terminal进入USB

1. Find what the drive is called

You’ll need to know what the drive is called to mount it. To do that fire off one of the following (ranked in order of my preference):

1
2
3
lsblk
sudo blkid
sudo fdisk -l

You’re looking for a partition that should look something like: /dev/sdb1. The more disks you have the higher the letter this is likely to be. Anyway, find it and remember what it’s called.

2. Create a mount point (optional)

This needs to be mounted into the filesystem somewhere. You can usually use /mnt/ if you’re being lazy and nothing else is mounted there but otherwise you’ll want to create a new directory:

1
sudo  mkdir /media/usb

3. Mount!

1
sudo mount /dev/sdb1 /media/usb

When you’re done, just fire off:

1
sudo umount /media/usb