贡献者: addis; admin
man 命令
会给出命令的帮助 (manual)
clear
清空命令行(老版本中其实是向下滚动一页),Ctrl+L
也可以。
Ctrl+C
(有时候 Ctrl+D
,例如退出 bash) 可以强制终止当前的工作 (注意只用于可以安全终止的任务!)
^
代表 Ctrl 键
Ctrl + =
就是放大,Ctrl + -
是缩小。
目录/文件名
执行。如果在当前目录就用 ./文件名
执行
#!
开头,如 #!/bin/bash
(默认)或者 #!/usr/bin/python
。#!
后面不应该有空格(即使有时候有也能用)
ls -l -h
可以写成 ls -lh
. 有些段选项有对应的长选项,如 ls -h
相当于 ls --human-readable
.
ls a*
会列出所有的 a
开头的文件、子文件夹、子文件夹中的文件和文件夹名。用 ls -d a*
可以只列出 a
开头的文件、和子文件夹。
ls -1
可以将文件名列成一列,ls -v
可以按照数字的大小排序(否则是逐位排序,如 1,10,100,2,10,200),ls *.md
可以只列出 md 文件
ls ./**/文件名
可以任意层子文件夹中的 文件名
。如果无效,需要先设置 shopt -s globstar
。
stat 文件
可以显示一些 metadata,例如大小权限,最后访问和修改时间等。
bash-completion
软件可以让该功能更完善
Ctrl-D
可以关闭当前 terminal
$变量
或 ${变量}
表示变量的值,自定义变量可以用 变量=值
, 注意等号两边不能有空格。
env
命令可以列出所有环境变量。env 环境变量=值 命令
可以单独给该命令设置环境变量而不改变其他程序的环境。#!/usr/bin/env 解释器
通常用于脚本程序中的 shebang,比直接用 #!/usr/bin/解释器
更 portable。
/etc/profile
文件的底部定义变量可以让所有人登录后都获得该变量。如果要只对一个用户创建该变量,在其 home 目录创建 .profile
文件即可。另外也可以在 ~/.bashrc
中 export 变量=值
/etc/bashrc
和 ~/.bashrc
文件都会被执行
history
命令可以输出最近 1000 条输入的命令
!数字
可以重新输入第 数字
条历史命令
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 -sh 目录
(或 du -hd 0 目录
)用于查看 目录
的大小(不会跟随 symlink,但是会包括 mount)。-h
是 human readable,-d
是 depth。-x
不会计入被 mount 的文件夹。
ctrl+u
可以删除光标前面的所有内容
ctrl+c
可以放弃当前输入直接开始新的一行
which 命令
可以查看某个命令的文件位置,whereis 命令
还可以查看源码、设置文件和文档等的位置(如果有)。
touch 路径/{文件1,文件2}
相当于 touch 路径/文件1 路径/文件2
也可以用两点如 touch 路径/文件{1..100}
可以生成 100 个文件。如果有多个大括号就做 “张量积”,例如 {a,b}/{1,2}
展开为 a1 a2 b1 b2
。如果需要指定步长就 {1..10..3}
代表 1,4,7,10
。
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 文件名
或者 rm /目录/文件名
删除文件 (注意是永久删除!)
mv 文件名 目录
可以移动文件, mv 文件名 新文件名
可以重命名。注意 mv
会覆盖文件,但是不会覆盖文件夹(只要目标的同名文件夹非空就不行,即使里面没有同名文件)。此时可以用 rsync
。
cp 文件名 目录
复制文件 cp 文件名 新文件名
复制到当前目录且重命名. 复制多个文件用 cp 文件1 文件2 目录
,也可以在 目录
前面加 -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
/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 相对路径
可以把相对路径变为绝对路径(展开所有软链,最后没有 /
)。相对路径
realpath 路径
dirname 相对或绝对路径/文件名或文件夹
返回 相对或绝对路径
(最后没有 /
)。
mkdir
新建文件夹, rmdir
删除空文件夹, rmdir -r
(recursive) 删除所包含的文件夹(其实不用 rmdir
用 rm
也可以但有点危险),-P
选项可以一次创建多层目录
dos2unix 文件1 文件2...
可以把 Windows 文件中的 CRLF 转换为 Linux 中的 LF 换行。会自动忽略二进制文件。和 git 一样通过 NUL 字符判断二进制。
dos2unix -ih 文件1 文件2...
可以显示文件信息,每个文件一行,格式为 DOS UNIX MAC BOM TXTBIN FILE
,分别是 CRLF的个数 LF的个数 CR的个数 是否有BOM 文本还是二进制 文件名
dd
命令可以直接在当前位置生成一个大小为 100 MB 的文件,内容为随机,还会显示写入速度
dd if=/dev/urandom of=./dump.txt bs=1M count=1024
写 1024Mb 随机文件
/dev/random
使用系统信息生成随机数,但有可能当 entropy 不足的时候会让 dd
终端。而 /dev/urandom
不会中断,应该是使用伪随机数,稍微可能没有那么安全。
dd conv=notrunc if=... of=文件名 bs=.. seek=第几字节 count=..
从文件的某个字节开始修改文件(覆盖内容)。如果不输入 count
,就会一直传直到 if
读完或者硬盘空间不足。用 status=progress
可以实时显示速度。
dd
也可以用来复制文件,可以用来测试传输速度。
locate ???
命令可以从数据库中寻找计算机上所有文件名包含 ???
的文件,但刚创建的文件可能找不到
truncate -s 100M 文件
可以把文件截断到某个大小,后面的数据丢弃。
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
(如果写入比较慢也可以 append:sudo dd ... oflag=append conv=notrunc
),sudo mkswap /swapfile
,sudo swapon /swapfile
一般无需重启,但如果系统不允许关闭 swap,也可以考虑用多个 swap 文件。有些系统中 /swapfile
也命名为 /swap
。
cat /proc/sys/vm/swappiness
检查 swapiness,值越大系统越倾向于使用更多 swap
sudo sysctl vm.swappiness=90
更改 swapiness (范围 0-100) 但是重启后会失效
sudo vim /etc/sysctl.conf
, 在最后加上 vm.swappiness=90
要立即生效用 sudo sysctl -p
free -h
可以查看当前 RAM 和 swap 的大小和使用情况。
/swapfile none swap sw 0 0
tree
(非系统自带)可以显示当前目录的树状图,tree -a
也显示隐藏文件。
sort
可以排列 stdin 输入的列。-k
可以按列排序
cmp --silent 文件1 文件2 || echo "files are different"
可以用于比较两个文件是否相同。
cpufrequtils
命令(需要安装)可以调整 cpu 性能方案,安装后在 /etc/default/cpufrequtils
中设置一行 GOVERNOR="performance"
,然后用 sudo service cpufrequtils restart
重启即可。要查看状态,用 cpufreq-info
,若输出包含 current policy: ... The governor "performance" may decide ...
,就说明是高性能模式。available cpufreq governors
给出可供选择的模式。
rsync -avzh src1 src2 ... dest
其中 src1
等文件或文件夹会自动同步到 dest
文件夹中(例如生成 dest_path/src1
等)。如果 dest
不存在,会自动用 mkdir 生成,但只能生成一层。src
和 dest
都可以是 ssh 远程或者本地
rsync -azvh ssh名:/路径/* 本地路径/
,其中 ssh名
是 用户名@域名或IP
或者 .ssh/config
配置文件中的连接名。-a
是 archive(包括所有子文件夹,文件的 owner 和 permission 和 symlink 都会原封不动复制),-v
是 verbose(显示详情),-z
是 zip(传输过程压缩)-h
人可读。
sudo
也还是显示 Operation not permitted
,可以把 -a
选项改为 -rl
,其中 r
是 recursive,l
是复制软链而不是复制软链指向的目标。
–dry-run
可以看看哪些文件会修改而不修改任何东西
--progress
选项(相当于 info=progress2
)可以显示传输速率,进度等详细信息。其他的一些选项如 --info=stats
显示总体的统计而不是单个文件。如果需要多个选项,可以用逗号隔开例如 --info=progress2,stats
--ignore-existing
会跳过 dest
中原本需要替换掉的文件。
--update
会跳过 dest
中修改日期较新的文件。
--partial
选项可以支持中断续传。
--remove-source-files
。注意不会删除任何目录。可以另外用 find src -type d -empty -delete
删除空目录。如果目标文件夹中已经有相同的文件(默认用修改时间和文件大小判断),也会删除源文件。
--remove-source-files
并不会真正的使用移动,即使目标目录在同一个文件系统也不会。可以使用我的脚本 mv_merge.py
src/
不会包括 src
本身,而去掉斜杠就会。dest
文件夹则没有这种区别。
--delete
。
rsync -avh --delete 目录1/ 目录2/
。完成后,两个目录的内容将一模一样。
\
的字符,例如 \(...\)
,需要用三次,例如 \\\(...\\\)
。本地的 shell 会先把 \\
变为 \
, \(
变为 (
--checksum
选项:如果文件大小和修改时间都相同,会用 checksum 检查它们是否真的相同。如果不加,rsync 会认为大小和修改时间都相同的同名文件就是相同的。
--whole-file
可以取消这个功能。
--exclude='foo/'
会忽略 src
中的所有名为 foo
的文件夹。--exclude='/src/foo/'
会忽略指定的那个 foo
文件夹。
rsync -av --include='*/' --exclude='*' --dirs src/ dest/
--log-file=日志文件
可以把所有输出存到 日志文件
中。
tree 文件夹 | tail -1
或者 find 文件夹 -type f -printf \\n | wc -l
。网上给的命令一般有问题:find 文件夹 -type f | wc -l
,如果输出的文件路径很长就会自动换行导致结果偏大(笔者测试 160 字符左右就会换行)!
tree 文件夹 | tail -1
或 find 文件夹 -type d -printf \\n | wc -l
后者会算上 文件夹
本身,所以结果多一个
!
就是排除这些文件,如 find . -type f ! -name "*.png"
查找不以 .png
结尾的文件(夹)
find /path1/ path2/ -name '<filename>'
可以搜索该目录下的文件. 加上 -iname
选项可以不区分大小写. 也可以用 '*<filename>*'
来表示含该文字的文件名. 加 -user 用户名
选项用于查找某个用户的文件,加 -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
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
/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 数等。
.conf
结尾
apt show 包
可以显示某个包的信息
libblas
,libgsl
等 library,用 dpkg -L 包
可以查看头文件和库文件(.a
,.so
)的位置。
-dev
结尾,通常意味着这个包提供头文件和库文件,可以让你在写程序时调用
-dbg
解为,通常意味着这个包的二进制中有调试信息,可以在 debugger 里面分析
apt list --installed
列出所有安装了的包
dpkg
用于手动(通过安装包文件)安装和卸载指定的包,不会自动安装或者卸载 dependency,也不会从网上下载包。apt
会调用 dpkg
。
aptitude
是比 apt
更高级的包管理器,还有 GUI 界面。
wget [-q] 网址 [-O 新文件名]
其中 -q
是安静模式,-O
是把下载的文件重命名。
touch 文件名
命令可以生成一个空的文本文件,也可以以更新文件的修改时间。
vim
nano
是一个轻量级命令行文本编辑器, 可以编辑文本文件. 打开文件命令: nano 文件名
。但一般还是用 vim。
head
和 tail
命令可以预览一个文件的前几行和后几行
echo <text>
可以在命令行显示该文字,也就是把命令的 args 输出到 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
>
的输出文件如果不存在, 就会新建一个.
wait <PID> && 命令 参数
可以等某个后台的 PID 结束后再运行命令。但如果这个 PID 在另一个 shell 中非后台非 nohup
执行,那么就会出错。
while pgrep -f "程序名PID等"; do sleep 20; done && 命令 参数
cat 文件
把文件的内容输出到 stdout
cat
把 stdin 的内容输出到 stdout
命令 | less
可以用键盘滚动输出结果(用于长输出以及没有滚动条的情况), 按 q 键退出
|
的作用相当于把前面一个命令的 stdout 输出放到后面一个命令的 stdin 输入中.
命令 > <文件名.txt>
可以把命令行的输出写入文件中 !! 例如: date > time.txt , cal > calander.txt
grep <string> < <filename>
可以在文档中高亮标出指定字符串,用 -i
不区分大小写。
cat <filename> | grep <string>
可以达到同样的效果
grep -iRl "文字" [目录]
可以搜索当前目录或者指定目录下所有子文件夹中文件的内容,并列出文件名。i
选项不区分大小写,R
搜索子文件夹,l
仅列出文件名。要列出每一个 match,用 grep -iR
即可
grep -v ...
可以反选,也就是排除所有满足条件的行
egrep
是支持正则表达式的 grep
,例如 lsb_release -a 2>&1 | egrep -o -m 1 [0-9]{2}\.[0-9]{2}
可以获取 ubuntu 系统的版本号(相当于 lsb_release -rs
)。其中 -m 1
只匹配第一个结果,-o
只输出匹配部分。
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'
可以分行显示每个路径('\n'
也可以换成 \\n
)。
命令 | cut -c 1-16
可以把 命令
输出的前 16 个字符提取出来。
sed
(stream editor)命令通常用于批量自动修改文本文件,而不是用交互的编辑器手动编辑。
sed
命令可以用来处理文件或 stdin
中的文字, 并输出到文件或者 stdout
. 例如
sed -e 's/^!\*nq/ /' inputfile.f90 > outputfile.f90
,其中 -e
是将后面的命令作用到 inputfile.f90
上. s/str1/str2/
是将文本中的 str1
替换成 str2
, \*
转义为 *
(直接用 *
就是通配符),^
大概是要求 str1
出现在行首.
命令 |sed -e '...'
也可以直接把 命令
的输出处理后输出到 stdout。
sed -i '...' 文件
可以直接修改文件而不是输出到 stdout
。例如 sed -i '8d' 文件
把文件的第 8 行删除。由于只有一个命令,-e
可以省略。
sudo find . -name "*.h" | xargs sudo sed -i -e 's/\r//g'
。选项 -i
直接修改源文件,-e
用于指定后面的 s/旧内容/新内容/g
g
代表 global,意思是全部替换,如果没有 g
将只替换第一个。
xarg
用于使用 piping 构建新命令,即将 find
输出到 stdout
的东西放到 sudo sed -i -e 's/\r//g'
的后面作为参数。
echo 111 222 333 | awk '{print $2}'
可以提取 222
sudo
(super user do) 加在命令前可以获得管理员权限, su
(super user) 可以把以下所有操作改为管理员权限 (不建议常用)。如果 ubuntu 中不允许 su
,那么就用 sudo -i
也是一样的。
su 用户名
可以临时改变登录的身份,sudo -i
或者 su
可以持续管理员身份。
sudo
以后,命令的执行者就会临时变为 root
,一些 config 文件也会使用 /root/
文件夹中的而不是 /home/用户名
中的,例如 /root/.ssh/config
。
sudo
的密码是用户密码, 而 su
的密码是 root 密码, 后者的权限更高
useradd [-m] [-g 用户组] [-U] [-s /bin/bash] 用户名
。其中 -m
给新用户创建 home 目录,-U
选项创建和用户名相同的用户组并作为 primary group(不能和 -g
选项同时使用),-g
用于指定用户的 primary group,-s
指定 shell。
adduser 用户名
可以用互动的方式创建用户。
passwd 用户名
可以修改密码
userdel 用户名
删除账户
users
命令显示目前所有登录的用户, who
命令可以显示更详细的信息
/etc/passwd
文件中记录了系统的所有 user,格式为 用户:密码(x代表已加密):用户ID:组ID:用户的可选信息(姓名电话等):HOME文件夹:默认shell
。通常 1000 以下的用户 ID 是系统用户。
/etc/group
文件记录了所有用户组的信息,格式为 组名:密码:组ID:组员
usermod -aG 组 用户名
/etc/passwd
中的。也可以有多个 secondary group,就是 /etc/group
中的每行最后一个信息。
chgrp
可以改变文件的组
groupadd 组名
新建用户组
groupdel 组名
移除用户组
gpasswd -a 用户名 组名
可以在组内新增用户
ls -l
最左边第一个字符是 filetype,第一列(之后三个字符)是 owner 的权限, 第二列是 group 的权限, 第三列是其他人的权限, r (read) w (write) x (execute)
。filetype 可以是 –
:常规文件,d
目录,l
symbolic link,还有一些其他不常见的,详见这里。
ls
选项:-a
(all)(显示隐藏) -m
(挤到一起) -1
显示为一列 -v
按照数字大小排序
chown 用户名 文件
修改文件的所有者,-R
对文件夹 recursive
ls -l
中第二列是 “link 的数量”,比较鸡肋,普通文件和软链是 1,文件夹是 2。
ls -ltr
中 -t
是根据修改时间从新到老排序,-r
是 reverse 也就是从老到新。
chmod 权限 文件
修改文件的权限. <权限> 是三位 8 进制数, 每一位是 x(1),w(2),r(4)之和. 常见的例子:7
代表 rwx
,6
代表 rw
,4
代表 r
chmod 权限 -R 文件夹
可以修改文件夹和所有内部子文件夹和子文件的权限。千万注意不要为了方便把一些系统文件夹甚至 /home/用户
文件夹的设置文件设得太开放,这可能会影响一些秘钥的自动验证,尤其是 ssh
相关的。
x
权限控制的是 cd
到其中的权限,而 r
权限则控制是否可以看到其中有什么文件。如果只有 x
没有 r
则代表你可以 cd
进去,但 ls
用不了。如果它的子文件夹也只有 x
没有 r
,那么你无法知道这个子文件夹存在,但如果你知道它的名字就可以 cd
进去。
rwx
都没有,那么文件夹和其子文件夹内的所有内容你都无法看到也无法进行任何操作,无论内部的文件和子文件夹有多开放。
rw
没有 x
,也只是好了那么一点点,你可以对文件夹就地重命名(不能移动),只能看到文件夹内第一层的文件和子文件夹的名字(看不到权限),其他同样什么也做不了。
644
,文件夹默认 755
(允许 x
,所有人可以进入文件夹)。
umask 002
可以修改新建文件的默认权限为 664
(666-002=664),且新建文件夹的默认权限被修改为 775
(777-002=775)。如果设 umask 007
,那么文件默认权限为 660
(6-7=0),文件夹为 770
。注意 umask
只对当前的 shell 生效,要永久生效可以放到 ~/.bashrc
里面。
sgid
)开启,那么创建文件和文件夹的组默认为它所在的文件夹的组,且创建的文件夹也会默认开启 SetGID。
chmod +s
。在显示权限时,文件夹会显示为 rws
。s
的编号是八进制的 2000
,例如可以用 chmod 2775 文件夹
。
root
,组设为可以访问的组,权限设为 2750
。所有子文件夹和文件的组设为可以访问的组,权限分别设为 2775
和 664
。每个用户的 ~/.bashrc
中 umask
设为 002
(默认为 022)。
suid
)权限可以让一个文件被执行时具有 owner 的权限而不是执行者的权限。suid
对文件夹没有任何作用。它的编号是八进制的 4000
。
sgid
,那么它被执行时具有所属组的权限而不是执行者的组的权限。
sticky
权限设在文件夹上,可以让里面创建的文件只能被它的 owner 或 root 重命名或删除。而一般情况下,任何对文件夹具有 w
权限的人都可以重命名和删除里面的文件。注意无论如何重命名和删除文件都和文件本身的权限无关。对文件设置 sticky
没有作用。
folder=文件夹
group=组
sudo chown root $folder
sudo chgrp $group -R $folder
sudo chmod 2750 $folder
find $folder -type d -exec sudo chmod 2775 {} \;
find $folder -type f -exec sudo chmod 664 {} \;
find $folder -type f -name '*.sh' -exec sudo chmod +x {} \;
sudo echo umask 002 >> /home/用户1/.bashrc
sudo echo umask 002 >> /home/用户2/.bashrc
...
groups
或者 groups <user>
可以查看用户所在的组
id
可以查看用户的信息 uid (user id) gid (group id)
vim /etc/group
可以查看记录 group 信息的文件
gpasswd -d <username> <groupname>
可以在组中移除用户
hostname
可以显示当前主机的名字. 也可以用环境变量 HOSTNAME
sudo hostname 新名字
可以改变 hostname
top
, 会显示实时进程.
K <PID>
会结束对应编号的进程. 系统的关键进程是杀不掉的.
last <user>
用于查看 <user>
最近登录的状况. last
用于查看所有 user 登录的状况. last -数字
可以查看最近若干次登录的记录
sudo visudo
可以安全地编辑管理员权限文件 /etc/sudoers
(保存时会检查语法错误),默认使用 nano 编辑器,要用 vim
可以 sudo update-alternatives --config editor
然后选 vim。
visudo
设置里面 Defaults env_reset
后面加上 ,timestamp_timeout=3600
,那么可以设置输入密码以后一个小时内不需要重复输入(默认只有几分钟)
ps aux
会显示当前所有进程 (process), PID 是 process ID, 用于终止进程
ps aux | grep 搜索词
会搜索当前进程中包含 搜索词
的内容。包括运行的命令和参数
ps -p 进程号 进程号 ...
可以用来查看进程的信息。
ps -o ppid= -p 进程号
可以查看父进程(许多进程都不是手动运行的而是父进程发起的)
dd if=/dev/urandom of=/dev/null &
其中 &
表示在后台运行,按回车后会输出 PID(进程号)。连续输入这个进程 4 次,然后用 top
命令打开进程管理,可以看到它们出现在顶部。
NI
就是 nice value
r
(renice) 可以调整进程的 nice value(优先级,越小越优先)按 ESC 可以退出
ionice
可以调整硬盘读写的优先级:ionice -p <PID>
查看某个进程的优先级(0 到 7,从高到低),ionice -p <PID> -n 优先级
可以改变优先级。
k
可以杀进程,输入进程的 PID,两次回车即可
pstree
可以看到哪些进程生成了哪些子进程,例如 shell 里面运行 .sh 文件会生成一个子进程用于运行一个新的 shell
kill -STOP 进程号
可以暂停程序
kill -SIGCONT <PID>
把某个 stop 的命令继续运行。
kill -CONT
可以继续暂停的程序
kill -2 进程号
给进程发送 SIGINT
,相当于 Ctrl+C
kill -9 进程号
,就是给进程发送 SIGKILL
。会立即杀掉进程不给它收尾的机会。
Ctrl+Z
可以暂停(stop/suspend)一个命令(SIGTSTP
)
jobs [-l]
可以列出所有 stop 的命令 -l
会列出 pid。一开始的数字叫做 job id
fg
把最近 stop 的命令回复到前台(foreground),fg %1
把 job id 为 1 的命令恢复到前台
bg
类似于 fg
,但放到后台继续运行。
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
选项就解压到当前文件夹.
.tar.xz
结尾的压缩包,就用 tar -xvJf 文件.tar.xz
解压。
tar
前,可以用环境变量 GZIP=-9
来指定压缩级别(1 到 9)。
gzip [-9] < 文件 > 文件.gz
,其中 -9
可以增加压缩率。
zip -r 文件名.zip files
unzip archive.zip
解压
zip -r -P 密码 文件名.zip files
-0
到 -9
可以设置压缩等级,9 得到的文件最小。
-d
指定解压路径(如果文件夹结构已经存在不会报错)
-n
永不覆盖已存在的文件
-q
安静模式(不打印解压文件)
zip -r 文件名.zip files -x "*.log"
可以排除所有 .log
后缀名的文件
zip
的分卷压缩的结果 xxx.zip.001, xxx.zip.002, ...
其实就相当于压缩成一个文件然后用 split
命令切割。
7z x 压缩包
解压到当前文件夹
-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 {} \;
openssl
可以用来给文件或字符串加密或解密
openssl aes-256-cbc -nosalt -pbkdf2 -in 文件名 -out 加密文件名 -pass pass:密码
openssl aes-256-cbc -nosalt -pbkdf2 -d -in 加密文件名 -out 文件名 -pass pass:密码
echo '需要加密的字符串' | openssl enc -base64 -e -aes-256-cbc -nosalt -pbkdf2 -pass pass:密码
echo "需要解密的字符串" | openssl enc -base64 -d -aes-256-cbc -nosalt -pbkdf2 -pass pass:密码
-nosalt
,文件加密得到的结果的 hash 是不稳定的。
-base64
使用 a-z
,A-Z
, 0-9
和 +=
64 个字符对加密结果进行编码。另外也可以用 -hex
用 16 进制编码
cat 文件名 | openssl enc -base64 -e -aes-256-cbc -pass pass:密码 > 加密文件名
openssl
同样也可以生成密钥对,然后用密钥给文件加密,具体问 GPT 吧。
sftp [usr@][url]
就和 ssh [usr@][url]
一样。成功以后会出现提示符 sftp>
,可以进行下一步操作
sftp>
环境下同样可以用 cd
, ls
, pwd
等命令。在这些命令前面加 l
(local)可以获取本地文件信息,如 lcd
,lls
,lpwd
get /path/to/file
可以传输某个文件到本地(进入 sftp 时的目录)
get /remote/file /local/file
可以传输某个文件到本地指定的目录和文件名,但该目录必须存在
mget 文件1 文件2
可以下载多个文件
put
和 mput
用法也类似
get -r 文件夹
可以传送整个文件夹
sftp -oPort=xxx xxx@xxx.xxx.xxx.xxx
mkdir, rmdir, rename, chown, chmod
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
PATH
每个路径显示成一行,用 echo $PATH | tr : \\n
。tr
命令把 :
替换为换行符。
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
查看网卡。
cpufrequtils
可以用于调整 cpu 频率。
jpg
或 png
:安装 sudo apt install libheif-examples
。然后 find . -iname "*.heic" -exec heif-convert -q 100 {} {}.jpg或png \;