命令行技巧

m4 tool

m4 macro language http://mbreen.com/m4.html

comman line invoking
——

m4 -D

builtins
——

define(, )
undefine()
ifdef(, , )
ifelse(, , , )
eval()
len()
include()
syscmd()
`’are quotes
# for comments

M4 rules
it reads in the macro’s arguments (if any)
it determines the expansion of the macro and inserts this expansion at the beginning of its input
m4 continues scanning the input, starting with the expansion

example:
define(`definenum’, `define(`num’, `99′)’)
num # -> num
definenum num # -> define(`num’, `99′) num -> 99

Unless a nested macro is quoted, it is expanded immediately:

define(`definenum’, define(`num’, `99′))
num # -> 99
definenum # ->

Linux 命令行文件管理

## get current file path

“`
#!/bin/bash
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=$(readlink -f “$0”)
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH=$(dirname “$SCRIPT”)
echo $SCRIPTPATH
“`

这些程序基本都有一个模式:如果不给定文件作为参数,那么就从stdin读取,从 stdout 输出,非常适合 pipe,而且一般可以接受多个文件作为参数,并把结果合并

## ls

ls 的一个很好用的命令组合 `ls -sail`

## stat 和 file

stat 读取一个文件的所有信息,file 猜测文件的类型

## cat

cat > fiie1 从标准输入读取并插入到file1
cat -ns file -n命令表示加入行号,-s 表示压缩多个空行到一个

## chattr

## find

### Syntax
“`
find

[!]
“`

### Filters
“`
-name 后面可以跟通配符
-wholename
-regex Match on a whole path -iregex 不区分大小写
-type 文件类型 f 文件 d 目录 l 链接
-atime/mtime/ctime 使用+-区分未来过去,可以使用的单位smhdw
-newer file 比
-size 后面跟大小可以使用ckMGTP
-user/-group/-nouser 用户
-perm 权限
-path 在整个路径中,使用通配符
“`

### Actions

执行的动作跟在-exec/-ok后面
“`
find … -exec command {} + .. # give all files combined to the command
find … -exec command {} \; # give each file
“`

### Tips

如果打印出绝对路径,使用find $PWD …

### find with xargs

`find … -print0 | xargs -0 …`

A numeric mode is from one to four octal digits (0-7), derived by adding up the bits with values 4, 2, and 1. Omitted digits are assumed to be leading zeros. The first digit selects the set user ID (4) and set group ID (2) and restricted deletion or sticky (1) attributes. The second digit selects permissions for the user who owns the file: read (4), write (2), and execute (1); the third selects permissions for other users in the file’s group, with the same values; and the fourth for other users not in the file’s group, with the same values.

## 权限
Linux 文件的权限可以使用0-7的四个八进制数字代表, 由1/2/4三个数字相加而成. 省略的数字会被认为是按0打头的. 第一个数字设定了 set user ID(4), set group ID(2) 和 限制删除或者叫 sticky bit(1). 第二个数字设定了文件所有者的权限: read(4), write(2), execute(1). 第三个设定了文件所在组的权限

命令行压缩图片的工具

加载速度对于网页的体验还是很重要的, 而每个页面比较耗费带宽的资源就是图片了, 所以在页面发布后对图像做适当的压缩是很有必要的.

常用的图片格式基本有三种: jpg, png 和 gif, 分别有不同的压缩工具

JPG 压缩建议使用 jpegoptim, 实测压缩比在40%左右, 最常用的语法是

`jpegoptim -p -m

`

其中 -p 是保留 mtime 的意思, 也可以用 –perserve, -m 后面跟两个数字表示, 压缩的比例, 一般用90即可, 肉眼无法分辨, 且能够压缩掉40%左右

png 压缩有两个选项, 常规的 optipng 和另一个新一点 pngquant, 测试了一下, 发现 optipng 速度慢而且压缩效率低, pngquant 则表现相当优秀, 但是需要注意 pngquant 是有损压缩.

pngquant 的用法也简单粗暴, 直接 pngquant 就好了, 如果嫌压缩不够可以使用 pngquant . 指定一个较少的色彩数.

gif 图像的压缩可以使用gifsicle

`gifsicle -O2 old.gif -o new.gif`

另外需要注意的是, jpegoptim 默认覆盖原图像, pngquant 会生成新的图像, gifsicle 需要制定新图像的名字.

如果需要对一个目录下的所有文件都进行优化, 可以配合 find 命令使用, 比如

“`
find . -name “*.jpg” -exec jpegoptim {} -m90 -p
find . -name “*.png” -exec pngquant {}
“`

通过以上命令就可以把降低一些图片的体积

converting mp4 to gif

## Converting MP4 to gif

To convert the entire video to GIF, use the following command:

`ffmpeg -i small.mp4 small.gif`

To convert just a portion of a video clip to GIF, use the following command:

`ffmpeg -t 3 -ss 00:00:02 -i small.webm small-clip.gif`

The snippet above directs ffmpeg to create a GIF 3 seconds long starting at 2 seconds into the video.
The default conversion doesn’t appear to be high quality, so you can configure the bitrate via another parameter:

`ffmpeg -i small.mp4 -b 2048k small.gif`

## Convert GIF to Video

The command is quite simple:

`ffmpeg -f gif -i animation.gif animation.mp4`

You can use this same command format to convert to other video formats:

“`
ffmpeg -f gif -i animation.gif animation.mpeg
ffmpeg -f gif -i animation.gif animation.webm
“`

ffmpeg and ImageMagick are awesome media utilities which you should take some time to check out if you have any questions about how to get something done!

## optimize

gifsicle to scale down the image to a smaller size

I used `ffmpeg -i foo.mp4 -r 5 -vf scale=270:-1 foo.gif` , where -r 5 cuts it to 5 frames per second, and `-vf scale=270:-1` scales the output to a width of 270 pixels and a height that matches the aspect ratio.

Crontab 的语法和使用

Crontab 时间的语法:

“`
Minute Hour Day Month DoW
“`

每一个选项默认都是第几的意思

* Minute, 每小时的第几分, 可选值 0-59
* Hour, 每天的第几个小时, 可选值 0-23
* Day, 每月的第几天, 可选值 1-31
* Month, 每年的第几个月, 可选值 1-12
* DoW, 每周的第几天, 可选值 0-7, 0 和 7 都代表 Sunday
* Command, 要执行的命令

另外:

– 用 * 表示所有
– 可以用逗号分隔指定多个
– 用 `*/xx` 表示每 xx 一次

比如

“`
5 * * * * echo “hello world”
“`

每小时的第五分钟打印 hello world

更多地例子

“`
* * * * * 每分钟
12 * * * * 每小时第 12 分
0,15,30,45 * * * * 每小时的第 0, 15, 30, 45 分, 也就是每15分钟一次
0 4 * * * 每天的凌晨 4 点
0 4 * * 2 每周二的凌晨 4 点
*/4 2-6 * * * 2点和6点之间每 4 分钟一次, 也就是 0, 4, 8…
“`

# crontab 命令

应该使用 crontab 命令来编辑 crontab 文件, tab 就是 table 的缩写

“`
crontab -e # 编辑 crontab
crontab -l # 列出 crontab
crontab -u # 指定用户
“`

crontab 还支持一些特殊语法

“`
@hourly 相当于 0 * * * * 也就是每小时执行
@daily 相当于 0 0 * * * 也就是每天执行
@weekly 相当于 0 0 0 0 0
monthly
@yearly
@reboot at reboot
“`

NOTE:

“`
# add these line to tweak cron behavior
SHELL=/bin/bash
HOME=/
MAILTO=”example@digitalocean.com”
“`

# Cron 表达式的局限性

cron 表达式难以表达 “every x” 这个语义。比如说每隔 9 个小时如何, 每隔 13 分钟如何如何。

# cron 的实现

Linux 命令行账户管理

执行 `sudo vi /etc/suduers`, 然后输入:

`username ALL=(ALL) NOPASSWD: ALL`

“`
useradd -m USERNAME # add a user
userdel USERNAME # delete a user
passwd -e # password expire next time user login

groups username # view username groups
usermod -G groupname username # add user to a group
usermod -g groupname username # set user to a group

newgrp
make newly added group work immediately without login/out
“`

chsh 提示输入密码的问题

“`
Changing /etc/pam.d/chsh: from:

auth required pam_shells.so
to

auth sufficient pam_shells.so
“`