Linux 开发工具 压缩 CheatSheet
2017-03-22
rar
rar a xxx.rar files...
rar e xxx.rar ./
rar a -p123456 xxx.rar files...
rar e -p123456 xxx.rar ./
rar a -v20m xxx.rar files...
tar
常用的参数说明(grep "^ \-[a-zA-Z0-9]" <(tar --help) | sort
):
vf
分别表示输出详细信息、指定压缩包名称
x
解压
c
压缩
t
列出压缩包里面的文件列表
- 压缩文件类型(Linux 下最常用的两种):
z
:gz
j
:bz2
# To extract an uncompressed archive:
tar -xvf /path/to/foo.tar
# To create an uncompressed archive:
tar -cvf /path/to/foo.tar /path/to/foo/
# To extract a .gz archive:
tar -xzvf /path/to/foo.tgz
# To create a .gz archive:
tar -czvf /path/to/foo.tgz /path/to/foo/
# To list the content of an .gz archive:
tar -ztvf /path/to/foo.tgz
# To extract a .bz2 archive:
tar -xjvf /path/to/foo.tgz
# To create a .bz2 archive:
tar -cjvf /path/to/foo.tgz /path/to/foo/
# To list the content of an .bz2 archive:
tar -jtvf /path/to/foo.tgz
# To create a .gz archive and exclude all jpg,gif,... from the tgz
tar czvf /path/to/foo.tgz --exclude=\*.{jpg,gif,png,wmv,flv,tar.gz,zip} /path/to/foo/
# To use parallel (multi-threaded) implementation of compression algorithms:
tar -z ... -> tar -Ipigz ...
tar -j ... -> tar -Ipbzip2 ...
tar -J ... -> tar -Ipixz ...
zip
# Create zip file
zip archive.zip file1 directory/
# To list, test and extract zip archives, see unzip
cheat unzip
# Extract archive
unzip archive.zip
# Windows 下创建的压缩包放到 Ubuntu 下解压可能会有编码问题
unzip archive.zip -O gbk
# Test integrity of archive
unzip -tq archive.zip
# List files and directories in a file
unzip -l archive.zip
7z
sudo apt install p7zip-full
dpkg -L p7zip-full p7zip | grep bin/
# /usr/bin/7z
# /usr/bin/7za
# /usr/bin/7zr
# /usr/bin/p7zip
文档中说是支持 7z,xz,tar,gz,zip,bz2,iso,rpm,deb 等等等等格式,不过没用过。
# 压缩
7z a xxxx.7z files...
# 解压
7z e xxxx.7z
# 查看文件列表
7z l xxxx.7z
参考
man
--help
cheat
/ tldr
Linux
2017-02-26
dc, desk caclulator,使用的是逆波兰式表达方法,而不是熟悉的代数标记法。
只是一些简单的用法,复杂的指令就不研究了:
# 1 + 2 + 3 + 4 + 5
dc -e "1 2 + 3 + 4 + 5 + p"
# 4 ** 3
dc -e "4 3 ^ p"
就是数在前面,操作符在后面,最后 p 输出。
# 加 减 乘 除 取余
+ - * / %
# 乘方 开方
^ v
# 用后面的数除以前面的数
~
# 清除结果
c
# 设置精度为 3
3k
如果进入 bc 交互模式,按 q 退出。
dc -e "3k 1 2 / p 2 / p"
.500
.250
Linux CentOS RPM Yum
2017-02-08
总有些时候需要操作一些老旧的 CentOS 版本,如果需要更新就比较麻烦了,因为绝大部分更新源都不对老版本提供服务了。
这时我们只好使用 CentOS Vault,从官方接受这最后的支持,慢慢的下载更新。
Linux ShellScripting
2017-01-10
command >output.txt # 把标准输出重定向到一个文件中
command >> output.txt # 把标准输出重定向到一个文件中(追加)
command 1>output.txt # 把标准输出重定向到一个文件中
command 1>>output.txt # 把标准输出重定向到一个文件中(追加)
command 2>output.txt # 把标准错误重定向到一个文件中
command 2>>output.txt # 把标准错误重定向到一个文件中(追加)
command >output.txt 2>&1 # 把标准输出和标准错误一起重定向到一个文件中
command >>output.txt 2>&1 # 把标准输出和标准错误一起重定向到一个文件中(追加)
command <input.txt # command命令以output.txt文件作为标准输入
command <input.txt >output.txt # command命令以output.txt文件作为标准输入, 以 output.txt 文件作为标准输出
# 从标准输出中读入,直至遇到delimiter分界符(不能与已存在的文件重名)
command << delimiter
command <&m 把文件描述符m作为标准输出
command >&m 把标准输出重定向到文件描述符m中
command <&- 关闭标准输入
Linux
2017-01-02
示例
# %c 表示当前 locale 的日期和时间
$ date +%c
2017年01月02日 星期一 12时00分00秒
# 获取当前时间戳
$ date +%s
1483329600
# -d 表示使用指定时间,而非默认的当前时间
# 获取指定时间的时间戳 (时间字符串 -> 时间戳)
$ date +%s -d "2017/01/01 00:00:00"
1483200000
# @ 表示时间戳
# 时间戳 -> 时间字符串
$ date -d @1483200000 # 等于: date --date="@1483200000"
2017年 01月 01日 星期日 00:00:00 CST
$ date -d @1483200000 +%c
2017年01月01日 星期日 00时00分00秒
# -u 表示使用 UTC 时间
$ date -u
2017年01月02日 星期一 14时00分00秒 UTC
$ date -d @1483200000 -u
2016年 12月 31日 星期六 16:00:00 UTC
$ date +%Y%m%d%H%M%S
20170102120000
# -R, --rfc-email, RFC 5322 格式
$ date -R
Mon, 02 Jan 2017 12:00:00 +0800
$ date --rfc-3339=date # 可以缩写成 d
2017-01-02
$ date --rfc-3339=seconds # 可以缩写成 s
2017-01-02 12:00:00+08:00
$ date --rfc-3339=ns # 可以缩写成 n
2017-01-02 12:00:00.000000000+08:00
常见日期格式占位符
- Y 年,4 位数字
- m 月,2 位数字
- d 日,2 位数字
- H 时,2 位数字
- M 分,2 位数字
- S 秒,2 位数字
- F 完整日期, 等于
%Y-%m-%d
- T 完整时间, 等于
%H:%M:%S
- R 等于
%H:%M
Linux
2016-09-14
用等于号隔开的一组路径,当我们执行一个命令时,会逐个检查这些路径,直到找到一个可以执行的文件。
Linux find
2016-07-29
目录
find . -path ./.git -prune -o -print
find . -path ./.git -prune -o -path ./build -prune
目录深度
如果使用这几个参数,那么这个参数应该放到最前面
-depth
-maxdepth
最大迭代深度
-mindepth
最小迭代深度
文件名
正则
find ./apps/api/ -maxdepth 3 -regextype "posix-egrep" -regex ".*/(vpc.py|server.py)"
空目录/空文件
# 空目录
find . -type d -empty
# 删除空目录
find . -type d -empty -delete
find . -type d -empty -exec rmdir {} \;
# 空文件
find . -type f -size 0c
find . -type f -empty
# 删除空文件
find . -type f -empty -exec rm {} \;
find . -type f -empty | xargs rm -f
# 如果文件名中有空格,0 是很有必要的
find . -type f -empty -print0 | xargs -0 rm -f
# 交互式
find . -type f -empty -ok rm -rf {} \;
类型
选项:b
, c
, d
(目录), p
, f
(文件), l
(链接), s
(Socket), D
用的多的还是目录和文件查找:
大小过滤
可用单位:b
(块,512B,默认), c
(Byte), w
(字,2B), k
, M
, G
说明:+n, -n, n 分别表示大于,小于,等于。这个规则对 -amin
(距离上次访问分钟数), -mtime
(距离上次编辑天数), -gid
, -inum
(inode 数), -links
(硬链数), -size
, -uid
, -used
有效。
大于/小于 10M 的文件:
find . -maxdepth 1 -type f -size +10M
find . -maxdepth 1 -type f -size -10M
# 列出小于三兆的 mp3 文件
find ~/Music -name '*.mp3' -size -3M -ls
权限过滤
# 精准匹配
find . -type f -perm 755 -iname "*.md" -exec chmod 644 {} \;
# 与:u g o 都有执行权限,最低权限判断
find . -type f -perm -111 -iname "*.md" -exec chmod 644 {} \;
# 或:u+x | g+x | o+x 满足一个条件即可
find . -type f -perm /111 -iname "*.md" -exec chmod 644 {} \;
# 这几个参数可以注意一下:
# -writable
# -readable
# -executable
find . -type f -executable -ls
时间过滤
创建和访问时间:
-amin
访问时间(分钟)
-atime
访问时间(天)
-cmin
创建时间(分钟)
-ctime
创建时间(天)
-mmin
修改时间(分钟)
-mtime
修改时间(天)
值得注意的是,上面按天为单位的那些时间过滤参数是按整除来算的,比如:find $HOME -mtime 0
,表示一天以内,应为修改时间整除 24 小时为 0 的就是 24 小时以内。
还有一个参数 used
,好像是文件状态变更之后的访问时间。
PS: 关于三种时间的差异,参考:2015-01-03 Linux 时间: atime, mtime, ctime。
执行命令
使用 ls 参数
-ls
和 ls
命令一样,列出详细信息
find . -name '*.py' -ls
find $HOME -maxdepth 1 -type d -ls
# ls 输出非 ASCII 字符会转义,对中文环境不友好
find $HOME -maxdepth 1 -exec ls -ldh {} + | column -t
使用 delete 参数
find . -maxdepth 1 -type f -name '*~' -delete
find . -maxdepth 1 -type f -name '*.pyc' -delete
使用 exec 参数
find . -type f -exec chmod 644 {} \;
find . -name "*.php" -exec mv {} ~/codes/php \;
find . -type d -name "__pycache__" -exec rm -rf \;
find . -type d -name "__pycache__" -exec rm -rf {} +
find . -type d -name "__pycache__" -depth +4 -print0 -exec rm -rf {} +
联合 xargs 命令:
find . -type d -empty -print0 | xargs -0 -I {} /bin/rm -rf "{}"
find /var/cache/TheSunProject/ -type d -name "backup_*" -print0 | xargs -0 -I {} /bin/rm -rf "{}"
find . -type d -mtime +30 -print0 | xargs -I dir -0 /bin/rm -rvf "dir" > /tmp/delete.log
大部分时候,我们都是用 \;
结果,但其实是有两种方案的:
-exec command ;
Shell 中,分号需要转义 (\;
)
总是成功返回
-exec command +
一次提供所有参数
echo "import sys; print('>>> %r <<<' % (sys.argv[1:], )); exit(2)" > /tmp/a.py
mkdir -p /tmp/a; cd /tmp/a; touch a " b c " "d;" e;
find . -type f -exec python /tmp/a.py {} \;
# >>> ['./ b c '] <<<
# >>> ['./e'] <<<
# >>> ['./a'] <<<
# >>> ['./d;'] <<<
echo $?
# 0
find . -type f -exec python /tmp/a.py {} +
# >>> ['./ b c ', './e', './a', './d;'] <<<
echo $?
# 1
复杂逻辑
参考手册中 OPERATORS 一节:
( expr )
在 shell 中括号需要转义
- 与
expr1 expr2
expr1 -a expr2
expr1 -and expr2
- 或
expr1 -or expr2
expr1 -o expr2
- 非
-not expr
! expr
expr1 , expr2
排除
find . -path ./.git -prune -false -o -type f
find . -name .git -prune -false -o -used -7 -type f -print
find . -type d \( -name .git -o -name node_modules -o -name build \) -prune -false -o -print
Linux
2016-06-28
概念
useradd
命令
sudo useradd testuser -m -d /home/testuser -s /bin/bash
如果忘记加上 -m
参数,那就只好手动创建用户主目录(家目录):
sudo mkdir /home/testuser
sudo cp -rT /etc/skel /home/testuser
sudo chown -R testuser:testuser /home/testuser
此外,修改用户信息可以使用 usermod
命令:
sudo usermod -d /home/testuser
sudo usermod -s /bin/bash
$ tail -1 /etc/passwd
testuser:x:1001:1001::/home/testuser:/bin/bash
adduser
命令
就相当于封装了比较低级的 useradd
命令,除了执行上面的全部操作,还提供更多的配置项。
# 创建普通的用户帐号
sudo adduser testuser2
# 创建不能用于登录的系统帐号
sudo adduser --system share
$ tail -2 /etc/passwd
testuser2:x:1002:1002:Test User,303,15812345678,02788888888,hello world:/home/testuser2:/bin/bash
share:x:131:65534::/home/share:/bin/false
“Test User,303,15812345678,02788888888,hello world” 这一串是创建过程中让你输入的 “全名”、“房间号”、“工作电话”、“家庭电话”、“其他”,最后逗号隔开,放在 /etc/passwd
文件的注释字段里面。
用户组
addgroup
groupadd
groupdel
groupmems
groupmod
groups
Linux
2016-06-27
在一些和时间关联紧密的操作中,可要提防修改时间对系统运行的影响,这个时候 /proc/uptime
就派上用场了。
Linux
2016-06-19
通过命令调用,随机生成密码。
我常用的方法:date | md5sum | base64 | head -c16; echo