贡献者: addis
man <命令>
会给出命令的帮助 (manual)
clear
清空命令行(其实是向下滚动一页)
^
代表 Ctrl 键
目录/文件名
执行。如果在当前目录就用 ./文件名
执行
#!
开头,如 #!/bin/bash
(默认)或者 #!/usr/bin/python
ls -l -h
可以写成 ls -lh
. 有些段选项有对应的长选项,如 ls -l
相当于 ls --human-readable
.
ls -1
可以将文件名列成一列,ls -v
可以按照数字的大小排序(否则是逐位排序,如 1,10,100,2,10,200),ls *.md
可以只列出 md 文件
stat 文件
可以显示一些 metadata,例如大小权限,最后访问和修改时间等。
Ctrl-D
可以关闭当前 terminal, 安装 bash-completion 软件可以让该功能更完善
$<var>
表示变量的值,自定义变量可以用 <var>=<val>
, 注意等号两边不能有空格。
env
命令可以查看环境变量
etc/profile
文件的底部定义变量可以让所有人登录后都获得该变量。如果要只对一个用户创建该变量,在其 home 目录创建 .profile 文件即可.
/etc/bashrc
和 ~/.bashrc
文件都会被执行
!<number>
可以重新输入第 <number>
条历史命令
/etc/passwd
文件中记录了系统的所有 user
clear
命令
df
用于查看磁盘空间, -h
选项可以显示 Mb
, Gb
等,-T
选项可以增加显示文件系统类型.
du /some/path
用于查看指定目录中所有子文件夹的大小, -a
选项可以显示文件夹和文件. --max-depth=N
is used to control the level of subfolders to display, -h
is for human readable file size (Mb
, Gb
, etc)
du -hd 0
用于查看当前目录的大小(不会跟随 symlink,但是会包括 mount)。-h
是 human readable,-d
是 depth。-x
不会计入被 mount 的文件夹。
ctrl+u
可以删除光标前面的所有内容
ctrl+c
可以放弃当前输入直接开始新的一行
pwd
(present working directory)
pwd -P
可以显示当前的绝对目录,即不含 ~
等符号以及 symbolic link
cd
(change directory) /
(硬盘根目录) ~
(缩写 /home/parallels) (用户的 home 文件夹)
cd
相当于 cd ~
./
表示当前目录,常用于执行可执行文件或者 .sh
~/Documents
, ~/Desktop
, /usr/bin
(gfortran 安装在这里)
cd <文件夹名>
只能用于当前目录中的文件夹
cd ..
返回上层目录
cd -
返回刚才所在的目录
cd `pwd -P`
, 两个 `
(backtick)内的东西会先展开
rm <filename>
或者 rm /<dir>/<filename>
删除文件 (注意是永久删除!)
mv <filename> /<dir>
可以移动文件, mv <filename> <newname>
可以重命名。注意 mv
会覆盖文件,但是不会覆盖文件夹(只要目标的同名文件夹非空就不行,即使里面没有同名文件)。此时可以用 rsync
。
cp <filename> /<dir>
复制文件 cp <filename> <newname>
复制到当前目录且重命名. 复制多个文件用 cp <file1> <file2> <dir>
,也可以在 <dir>
前面加 -t
。注意 cp
会覆盖目标文件以及文件夹。
cp
在只拷贝一个 symlink 是会拷贝它指向的文件而不是 symlink 本身。cp -d
选项可以只拷贝 link。
cp -r 文件夹
时,如果文件夹本身不是 symlink,不会跟随文件夹中包含的 symblink。除非使用 -L
或者 --dereference
,那么将不会在目标中创建任何 symlink,而是全部展开。
cp
会默认覆盖目标的同名文件,cp -n
可以不覆盖且跳过(但不会提示)。如果要提示且手动逐个选择是否覆盖,用 -i
选项。
-a
(--archive
)相当于 -r --no-dereference --preserve=all
all 包括 mode,ownership,timestamps,context,links,xattr
<program_name> <filename.extension>
/mnt
目录下
sudo fdisk -l
显示所有的外接硬盘的路径名
sudo mount <硬盘地址> <新建文件夹路径>
sudo umount <硬盘地址>
断开连接
sudo mount -a
把 /etc/fstab
中的设置全部 mount 一次
ln -s /path/to/file /path/to/symlink
如果目标已经有同名文件或软链存在,就用 ln -sfn ...
(如果目标是软链,不加 n
无效)。
readlink 软链
或者 ls -l 软链
都可以查看软链的内容。注意软链的内容可以是相对或者是绝对路径。
readlink -f 相对路径
可以把相对路径变为绝对路径(展开所有软链,最后没有 /
)。相对路径
dirname 相对或绝对路径/文件名或文件夹
返回 相对或绝对路径
(最后没有 /
)。
mkdir
新建文件夹, rmdir
删除空文件夹, rmdir -r
(recursive) 删除所包含的文件夹 (其实不用 rmdir
用 rm
也可以!),-P
选项可以一次创建多层目录
dos2unix 文件1 文件2...
可以把 Windows 文件中的 CRLF 转换为 Linux 中的 LF 换行。
dd
命令可以直接在当前位置生成一个大小为 100 MB 的文件,内容为随机,还会显示写入速度
dd if=/dev/urandom of=./dump.txt bs=1M count=1024
写 1024Mb 随机文件
dd conv=notrunc if=... of=文件名 bs=.. seek=第几字节 count=..
从文件的某个字节开始修改文件(覆盖内容)。
locate ???
命令可以从数据库中寻找计算机上所有文件名包含 ???
的文件,但刚创建的文件可能找不到
sudo updatedb
可以将刚创建的文件加到数据库中,让 locate
可以找到(-v
选项显示哪些文件夹被更新)
locate
比 find
要快得多,因为数据库已经是 index 过的 -c
选项可以显示匹配结果的个数,-i
选项可以不区分大小写
plocate
是一个比较快的实现,mlocate
是一个比较安全的实现,命令都是 locate
,/etc/updatedb.conf
中可以设置 updatedb
的一些选项,例如忽略挂载到某个目录的硬盘,忽略 .git
文件夹等,忽略某些文件系统等。
rename 's/老名字/新名字/' *
。-n
选项显示重命名的预览,不真的重命名
sudo swapoff -a
不使用 swap file,sudo swapon -a
恢复使用。可能还需要在 /etc/fstab
里面注释掉相应的行。
sudo swapoff /swapfile
,sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 oflag=append conv=notrunc
,sudo mkswap /swapfile
,sudo swapon /swapfile
如果系统不允许关闭 swap,也可以考虑用多个 swap 文件。
tree
(非系统自带)可以显示当前目录的树状图,tree -a
也显示隐藏文件。
sort
可以排列 stdin 输入的列。-k
可以按列排序
cmp --silent 文件1 文件2 || echo "files are different"
可以用于比较两个文件是否相同。
–dry-run
可以看看哪些文件会修改
rsync -azvh 用户名@域名或IP:/路径/* 本地路径/
其中 -v
是 verbose,-h
是 human readable,-z
是在传输过程中压缩(通常只用于网络传输)
sudo
也还是显示 Operation not permitted
,可以把 -a
选项改为 -r
。
源文件夹/
不会包括 源文件夹
本身,而去掉斜杠就会。
-a
是 archive (包括所有子文件夹,文件的 permission 和 symlink 都会原封不动复制),-v
是 verbose(显示详情),-z
是 zip(传输过程压缩)-h
人可读
rsync -avzh file1 file2 folder3 file4 dest_path
其中 file1 到 file4 等文件或文件夹会自动同步到 dest_path
文件夹中(例如生成 dest_path/file1
,dest_path/folder3
)。如果 dest_path
不存在,会自动用 mkdir 生成,但只能生成一层。file, folder 和 dest_path
都可以是远程或者本地
--delete
。
rsync -av --delete 目录1/ 目录2/
。完成后,两个目录的内容将一模一样。
\
的字符,例如 \(...\)
,需要用三次,例如 \\\(...\\\)
。本地的 shell 会先把 \\
变为 \
, \(
变为 (
--remove-source-files
。注意不会删除任何目录。
--checksum
选项:如果文件大小和修改时间都相同,会用 checksum 检查它们是否真的相同。如果不加,rsync 会直接跳过大小和修改时间都相同的同名文件。
--whole-file
可以取消这个功能。
file
分割成 file-01
, file-02
, ...
split -b 500000000 -d file path/to/file-
-d
拓展名用数字而不是字母
-b 10
划分成 10 字节的小块
-l 4
划分成每个文件 4 行
-n 10
把文件 (几乎) 等分为 10 份
-a 4
拓展名位数为 4
cat file-* > file
find /path1/ path2/ -name '<filename>'
可以搜索该目录下的文件. 加上 -iname
选项可以不区分大小写. 也可以用 '*<filename>*'
来表示含该文字的文件名. 加 -user <name>
选项用于查找某个用户的文件,加 -size +100M
可以查找大于 100M 的文件。-type d
选项搜索目录,默认是只搜索文件
find ... -exec xxxx {} \;
可以将找到的每个结果分别用程序 xxxx
执行,find ... -exec xxxx {} +
将找到的结果用 xxxx
一次执行(如果数量太多也可能自动分为几次)。其中 {}
可以重复使用。
-execdir ... {} ... \;
相当于先 cd
到每个文件所在目录然后执行命令
find . -empty -type d -delete
删除空文件 find . -empty -type f -delete
find . -type f -executable
找所有的可执行文件。
find 文件夹 -type f -exec sha1sum {} \; | sort | sha1sum
可以对比两个文件夹。对比包含文件名,每个文件的路径,和每个文件(包括隐藏文件)的 hash,不包括 metadata(例如权限,最后修改时间等),不包括空目录,不包括软链。
find test -type l -exec printf "{} -> " \; -exec readlink {} \; | sort | sha1sum
/home/用户名
普通用户的用户文件
/root
管理员的用户文件
/boot
系统内核
/etc
系统设置
/usr
在用户之间分享的文件
/var
各种数据文件包括 log
详细标准见这里。
sudo apt-get install <appname>
安装程序(99%的程序都可以这样安装)(需要联网)
sudo apt-get remove <appname>
卸载程序
sudo apt-get upgrade <appname>
升级程序
apt-get
(和 apt-cash
,如果听说过)中常用的功能都在 apt
中有同样的,所以大部分情况下只需要 apt
就可以了,例如 apt install
,apt purge
。apt
对新手更友好,例如会默认显示进度条,更新的 package 数等。
apt show <packagename>
可以显示某个包的信息
libblas
,libgsl
等 library,用 dpkg -L <packagename>
可以查看头文件和库文件(.a
,.so
)的位置。
-dev
结尾,通常意味着这个包提供头文件和库文件,可以让你在写程序时调用
-dbg
解为,通常意味着这个包的二进制中有调试信息,可以在 debugger 里面分析
apt list --installed
列出所有安装了的包
dpkg
用于手动(通过安装包文件)安装和卸载指定的包,不会自动安装或者卸载 dependency,也不会从网上下载包。apt
会调用 dpkg
。
aptitude
是比 apt
更高级的包管理器,还有 GUI 界面。
wget [-q] 网址 [-O 新文件名]
其中 -q
是安静模式,-O
是把下载的文件重命名。
touch <filename>
命令可以生成一个空的文本文件
nano
是一个命令行应用, 可以编辑文本文件. 打开文件命令: nano <filename.txt>
head
和 tail
命令可以预览一个文件的前几行和后几行
echo <text>
可以在命令行显示该文字,也就是把命令的 params 输出到 stdout
echo <text> > <filename>
可以把文件中的文本替换 >>
可以附加在文本最后. 如果用双引号, 甚至还可以换行.
>
是 output redirect 操作, 类似, <
是 input redirection 操作, 可以把文档中的内容输入到命令行.
>
或者 >>
的对象需要 sudo
权限,那么用 tee
,如 echo 一些文字 | sudo tee [-a] 文件
其中 -a
是 append。
>
只用于将 stdout 输出到文件, 如果也要输出 stderr 有三种办法: 1.<command> > file1.out 2 > file2.out
, 2. <command> > file.out 2 > &1
, 3. <command> &> file.out
其中后两种将 stdout 和 stderr 输出到同一文件.
./program.x < <inputfile> > <outputfile> 2>&1
>
的输出文件如果不存在, 就会新建一个.
cat 文件
把文件的内容输出到 stdout
cat
把 stdin 的内容输出到 stdout
<命令> | less
可以用键盘滚动输出结果(用于长输出以及没有滚动条的情况), 按 q 键退出
|
的作用相当于把前面一个命令的输出放到后面一个命令的输入中.
<命令> > <文件名.txt>
可以把命令行的输出写入文件中 !! 例如: date > time.txt , cal > calander.txt
grep <string> < <filename>
可以在文档中高亮标出指定字符串,用 -i
不区分大小写。
cat <filename> | grep <string>
可以达到同样的效果
grep -iRl "文字" [path]
可以搜索当前目录或者指定目录下所有子文件夹中文件的内容,并列出文件名。i
选项不区分大小写,R
搜索子文件夹,l
仅列出文件名。要列出每一个 match,用 grep -iR
即可
sudo
, 否则有可能编辑了保存不了(例如一些 configuration file). 甚至要首先用 chown
把文件所有权变成自己的.
#
在文件中起标注的作用 (如果文件中有 linux 代码), 在命令行, #
后面的代码同样会被忽略.
iconv -f [encoding] -t [encoding] -o [newfilename] [filename]
。微软的 ANSI 格式其实叫做 iso-8859-1, 例如 iconv -f iso-8859-1 -t utf-8 -o out.txt in.txt
.
tr [opt] SET1 [SET2]
可以用来把 stdin 中 SET1
中的字符分别替换为 SET2
中的,输出到 stdout。另外 -s
选项可以把替换后相邻重复的字符只保留一个。例如 echo $PATH | tr : '\n'
可以分行显示每个路径。
sed
命令可以用来处理文件或 standard input 中的文字, 并输出到文件或者 standard out. 在 SCID_TDSE
的 makefile 中遇见, 命令是
sed -e 's/^!\*nq/ /' inputfile.f90 > outputfile.f90
其中 -e
是将后面的命令作用到 inputfile.f90
上. s/str1/str2
是将文本中的 str1
替换成 str2
, \*
转义为 *
(直接用 *
就是通配符),^
大概是要求 str1
出现在行首.
sed -i '...' 文件
可以直接修改文件而不是输出到 stdout。例如 sed -i '8d' 文件
把文件的第 8 行删除。
sudo find . -name "*.h" | xargs sudo sed -i -e 's/\r//g'
。选项 -i
直接修改源文件,-e
用于指定后面的 s/旧内容/新内容/g
xarg
用于使用 piping 构建新命令,即将 find 输出的东西放到 sudo sed -i -e 's/\r//g'
的后面
sudo
(super user do) 加在命令前可以获得管理员权限, su
(super user) 可以把以下所有操作改为管理员权限 (不建议常用)。如果 ubuntu 中不允许 su
,那么就用 sudo -i
也是一样的。
su <usr_name>
可以临时改变登录的身份,sudo -i
或者 su
可以持续管理员身份。
sudo
以后,命令的执行者就会临时变为 root
,一些 config 文件也会使用 /root/
文件夹中的而不是 /home/用户名
中的,例如 /root/.ssh/config
。
sudo
的密码是用户密码, 而 su
的密码是 root 密码, 后者的权限更高
useradd -m
(给新用户创建 home 目录) -g users
(设置用户组为 users) <username>
passwd <username>
可以修改密码
userdel <username>
删除账户
users
命令显示目前所有登录的用户, who
命令可以显示更详细的信息
ls -l
最左边第一个字符是 filetype,第一列(之后三个字符)是 owner 的权限, 第二列是 group 的权限, 第三列是其他人的权限, r (read) w (write) x (execute)
。filetype 可以是 –
:常规文件,d
目录,l
symbolic link,还有一些其他不常见的,详见这里。
ls
选项:-a
(all)(显示隐藏) -m
(挤到一起) -1
显示为一列 -v
按照数字大小排序
chown <user> <files>
修改文件的所有者,-R
对文件夹 recursive
ls -l
中第二列是 “link 的数量”,比较鸡肋,普通文件和软链是 1,文件夹是 2。
chmod <权限> <file>
修改文件的权限. <权限> 是三位 8 进制数, 每一位是 x(1),w(2),r(4)之和.
groups
或者 groups <user>
可以查看用户所在的组
id
可以查看用户的信息 uid (user id) gid (group id)
groupadd <groupname>
新建用户组
groupdel <groupname>
移除用户组
gpasswd -a <username> <groupname>
可以在组内新增用户
vim /etc/group
可以查看记录 group 信息的文件
gpasswd -d <username> <groupname>
可以在组中移除用户
hostname
可以显示当前主机的名字. 也可以用环境变量 HOSTNAME
sudo hostname 新名字
可以改变 hostname
top
, 会显示实时进程.
K <PID>
会结束对应编号的进程. 系统的关键进程是杀不掉的.
last -数字
可以查看最近若干次登录的记录
ps aux
会显示当前所有进程 (processes), PID 是 process ID, 用于终止进程
ps aux | grep <name>
会搜索当前进程中包含 <name>
的内容
dd if=/dev/zero of=/dev/null &
其中 &
表示在后台运行,按回车后会输出 PID(进程号)
连续输入这个进程 4 次,然后用 top
命令打开进程管理
NI
就是 nice value
r
(renice) 可以调整进程的 nice value(优先级,越小越优先)按 ESC 可以退出
ionice
可以调整硬盘读写的优先级。
k
可以杀进程,输入进程的 PID,两次回车即可
pstree
可以看到哪些进程生成了哪些子进程,例如 shell 里面运行 .sh 文件会生成一个子进程用于运行一个新的 shell
kill -STOP 进程号
可以暂停程序
kill -CONT
可以继续暂停的程序
kill -9
tar -czvf <path/name.tar.gz> <some/path/or/file>
是常见的压缩命令. 其中 -c
是 create, -v
是 verbose, -f
指定目标文件(一定要紧接文件名), -z
使用 gzip 压缩. 如果不需要压缩就用 -cvf <path/name.tar>
.
-c
换成 -x
(extract)即可, 如 tar -xzvf 文件.tar.gz -C 目标文件夹
如果省略 -C
选项就解压到当前文件夹.
gzip [-9] < 文件 > 文件.gz
,其中 -9
可以增加压缩率。
openssl aes-256-cbc -nosalt -in 文件名 -out 加密文件名 -pass pass:密码
openssl aes-256-cbc -nosalt -d -in 加密文件名 -out 文件名 -pass pass:密码
注意:文件加密得到的结果的 hash 是不稳定的!
echo '需要加密的字符串' | openssl enc -base64 -e -aes-256-cbc -nosalt -pass pass:密码
echo "需要解密的字符串" | openssl enc -base64 -d -aes-256-cbc -nosalt -pass pass:密码
-salt
和 -nosalt
是什么?
-base64
是什么?
cat 文件名 | openssl enc -base64 -e -aes-256-cbc -pass pass:密码 > 加密文件名
-o/path/to/extract/
指定输出路径
7z x 第一个文件名
即可
sudo apt-get install p7zip-full
find . -type f -exec 7z a {}.7z -p密码 -sdel {} \;
find . -type f -name "*.7z" -execdir 7z x {} -p密码 \; -exec rm {} \;
sftp [usr@][url]
就和 ssh [usr@][url]
一样。成功以后会出现提示符 sftp>
,可以进行下一步操作
sftp>
环境下同样可以用 cd
, ls
, pwd
等命令
get /path/to/file
可以传输某个文件到本地(进入 sftp 时的目录)
get /remote/file /local/file
可以传输某个文件到本地指定的目录和文件名,但该目录必须存在
get -r 文件夹
可以传送整个文件夹
sftp -oPort=xxx xxx@xxx.xxx.xxx.xxx
curl
是 client URL 的意思,用于通过 url 从服务器接受或发送信息。
curl "网址" -so 文件
可以把某个 url 返回的字符串(如 html 和 json)保存到文件中,其中 -s
是 silent,-o
是 output file。这大概相当于在浏览器中输入 网址
然后复制 html 源码等。
curl --header "<HeaderName>: 123" www.example.com
。可以发送一个 header 的 url,也可以用 -H
curl -u 用户名:密码 www.example.com
使用 Basic Auth 进行用户登录
sudo tasksel
快速安装某一类型的服务器需要所有的软件 (email server , file server, ...). 进入界面以后, 用空格选择想要的项目然按空格确认安装.
sudo /etc/init.d/<aptname> start
或者 stop
或者 restart
可以进行对某个软件的 service 进行操作, 而不需要重启 linux 系统.
echo $VAR
显示环境变量或任何变量。也可以用 printenv VAR
env
命令可以显示所有环境变量,也可以用 printenv
。
env
可以先对某个程序修改环境变量,再运行该程序
export VAR=XXX
修改环境变量(对子进程也有效)
VAR=XXX
修改环境变量(对子进程无效)
export VAR=~/opt/bin:$VAR
可以 append 某个变量(如 PATH)
PWD
是当前路径,修改该变量相当于 cd
PATH
是命令搜索路径,多个路径之间用冒号分隔,只有这里面的目录中的执行文件才不指定路径。常见路径包括 /bin
, /sbin
, /usr/bin
,/usr/sbin
,其中带 s
的目录中的文件通常不是给普通用户调用的,根目录的文件夹中的程序通常是用于启动或修复系统必须的,所以普通用户用得最多的是 /usr/bin
HOME
是用户的 ~
文件夹
USER
是当前用户名
LANG
是当前 local,推荐使用 en_US.UTF-8
BASH
是当前 bash 程序所在目录
PWD
是当前目录
LD_LIBRARY_PATH
是动态链接库的默认搜索地址,见这里。
LD_RUN_PATH
编译的链接阶段,如果没有指定 rpath
,就用该变量中的 path 替代。
g++
中的 -L
选项(make 的时候搜索静态或动态库的路径)可以用环境变量 LIBRARY_PATH
设置,-I
选项(搜索头文件的路径)可以用环境变量 CPATH
设置。
<cstdlib>
中的 char* getenv(const char* env_var);
alias
可以给一个长命令设置别名,例如 alias abcde='echo hello'
,仅限于当前 terminal,可以添加到 ~/.bashrc
中每次 login 都定义。
lscpu
查看 CPU 信息,free
查看内存使用情况,ifconfig
和 ip
查看网卡。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利