Open solomonxie opened 6 years ago
不是终端的颜色主题,只加了颜色主题但是文字还是同样颜色,其实没什么用。主要就是要类似于语法高亮的功能,要不然命令行里源源不断的一页一页的字冒出来实在不好读。
Mac中和Linux是一样的,直接在本用户的根目录添加一个.bash_profile
文件写入配置,打开颜色开关即可。
$ vi ~/.bash_profile
export CLICOLOR=1
但是效果不佳,开关顶多加上了ls
文件夹的颜色,没什么大用。如图:
所以就需要再进一步找一个靠谱的解决方案。
每次在命令行里进入有git的文件夹,都没什么显示,不像网上其他人截屏出来的样子,就好奇怎么弄的。下面分bash和zsh两种方式分别来说。
注:
这里都是使用的Mac Terminal.app做实验,Mac的iTerm或Linux上的终端没有做实验,但是操作不会有太大差异。
其实特简单,还是在~/.bash_profile
文件中添加:
$ vim ~/.bash_profile
# Shows Git branch name in prompt.
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
# Or hide User @ Name (still with git branch name)
# export PS1="\W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
效果如下:
类似于Bash,在~/.zshrc
这个文件中修改,打开后,随便找个位置(最好靠上面一点方便查看)加上一行DEFAULT_USER=$USER
即可。如果为zsh安装了Oh my zsh
这个工具(一般玩zsh第一步就是安装它),这里就不需要单独处理像Bash一样手动编程添加Git名称了,因为会自动出现。进入zsh后,可以看到效果如下:
当然,我这里的Git分支还配上了图标和颜色等,这都需要给终端(这里是Mac Terminal.app)安装相应配色方案,我用的是著名的Solarized Dark
配色方案。具体配色和字体问题(字体用来支持图标,因为那些图标的本质是文字),需要专开一篇来说。
有时候经常嫌一层一层目录实在太长太占地方,而且截屏时也不方便把全路径显示出来。所以需要隐藏起来会比较方便,需要看全路径的话一句pwd
就显示了。
默认全路径显示:
修改后效果:
Zsh中,配置文件~/.zshrc
里面可以配置DEFAULT_USER=$USER
来隐藏用户名和主机名,下面还有一句prompt_context() {}
设定一般来说是可以写入函数来隐藏全路径并只显示当前文件夹的。
但是配置了agnoster配色主题后,怎么修改好像都没用,参考这篇文章,得知,只要到agnoster配色主题的配置文件中改一个字即可:
找到文件:一般是在这个位置~/.oh-my-zsh/themes/agnoster.zsh-theme
,打开后找到prompt_dir() {}
这个函数,然后将prompt_segment blue black '%~'
最后面的~改为c即可:prompt_segment blue black '%c'
。
zsh
原称为Z Shell。也是一种shell,兼容最常用的bash这种shell的命令和操作,并且有很多增强,超强的订制性。查来查去,bash虽然很标准,但是自己日常的话还是不要太偏执,力求简单方便的工具更好,所以就玩弄起了zsh。超漂亮又简单,也很好上手。
Mac原生就安装了zsh,linux的话需要安装一下,简单如sudo apt-get install zsh
这样就安装好了。
可以先通过cat /etc/shells
查看自己有哪些shell,一般都会有很多种。
使用方法很简单,直接在命令行里输入zsh
就开始使用了。不过要变成每次打开终端默认使用zsh,则需要改配置。
Oh My Zsh
原本zsh就是很强大,但是配置超难,直到Oh my zsh工具出现,一切zsh的配置都变简单了。所以这是用zsh的必备工具,安装只需一句话:
sudo curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
屏幕显示这个图,就算安装好了:
然后再打开终端,感觉一切都变了:直接进入zsh,命令行前一大串的用户名主机等都被隐藏了,进入git文件夹时前面也都加上了git (master)
这样的带颜色分支字样,按Tab自动补全时也不用区分大小写了(太棒了)。。。如下图
有一点需要注意,安装完oh my zsh后,机子(Mac)上的Terminal会变成默认打开就进入zsh。如果不习惯的话,可以改回默认先。Mac的Terminal在设置里将shell open with
改成/bin/bash
就好了:
要想配置出这种好看的方案,标配就是:zsh
+ Meslo字体
+ Soloarized Dark显示方案
+ Agnoster配色方案
。网上有很多文章介绍,不过这里也简单总结个cheatsheet方便以后用。
注:之前已经写了zsh和基本工具oh my zsh
的安装方法了。后面都是在此基础上。
显示方案主要负责修饰命令行前缀,隐藏user@host,识别git文件夹,添加图标,命令高亮等。
去Solarized
官网下载一个zip压缩包。压缩包中包含了这种颜色方案应用在各种各样平台、终端、软件的配置文件。找到自己用的终端文件夹。如我用的是Mac Terminal,那么就在osx-terminal.app-colors-solarized
这个文件夹,将里面的Solarized Dark ansi.terminal
文件导入到终端。如下图:
在终端的配置里导入配色方案后,就出现了
Solarized Dark
选项,将其设为默认,重新打开终端,就出现基本的配色方案了。
Solarized配色包需要Meslo LG M Regular for Powerline
这种字体才能显示各种特殊字符(图标),下载好ttf字体文件并安装。下载链接在这里https://github.com/powerline/fonts/raw/master/Meslo%20Slashed/Meslo%20LG%20M%20Regular%20for%20Powerline.ttf
装好以后,可以在终端中输入这个来测试是否成功:
echo "\ue0b0 \u00b1 \ue0a0 \u27a6 \u2718 \u26a1 \u2699"
如果能正常显示所有图标,则安装成功。
然后打开终端的偏好设置,在当前Solarized
的配色方案下,找到字体选项,选择Meslo LG M Regular for Powerline
字体,成功。
不同于如Solarized显示方案,配色主题单纯负责颜色问题。
这个需要在Zsh配置文件~/.zshrc
中配置,由于agnoster
是Oh My Zsh工具自带,所以无需安装额外文件直接修改选项。
找到~/.zshrc
文件,将ZSH_THEME
变量改成agnoster
,保存并重新打开终端即可。如下图:
最后,我在Mac终端上显示效果如下:
好像颜色哪里差了点,是因为它原生在iTerm终端才能发挥完全效果。效果如下:
iTerm的配置方法和Terminal.app非常相似,自己在偏好设置中采用类似的操作即可。 关于其它Oh My Zsh自带的色彩主题,可以到这里看效果: https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
一般要一路cd进入五层以上的目录,是真的有点头疼。所以研究了下有没有设置快捷路径的方法
~/.bash_profile
或~/.zshrc
里面设置export DIR="/path/path/path"'这种来设置变量,然后引用是通过
$var来引用。 但是每次都加
$`确实有点不爽,好像也没达到什么特别快捷的方法。alias topath="cd /path/path/path"
这种来设置别名,每次在终端直接输入类似topath,回车即可。这种方式是可取的。
为了保证可管理性,建议所有的alias别名都放到~/.bash_profile
这种用户自定义的终端配置文件里,方便以后备份移植。zsh有了各种插件后才真是如虎添翼,各种命令高亮,自动补全,命令参数辅助等。
各种插件的安装方法各异,有的直接将插件文件夹拷贝到~/.oh-my-zsh/custom/plugins
目录中,然后在~/.zshrc
中的plugins
数组中加入插件名即可;有的则需要配合别的工具并在~/.zshrc
中加入别的命令。以下是几个常用的。
安装时经常会看到一些$ZSH_xx
变量,这些都是zsh或oh my zsh设置的各种变量,便于插件运用。我们安装插件时也可以用这些变量安装,如插件保存的位置一般为$ZSH_CUSTOM/plugins/插件文件夹名/
。
Oh my zsh自带插件
自带插件在安装时就已经存在了,默认是只开启了git一个插件。其它的话也很简单,只需要在~/.zshrc
文件中添加引用即可。打开文件找到plugins
数组,然后把插件名加入数组即算开启。
如下图:
目前已经有的自带插件在官网Github中可以看到,https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins。 凡是这里有的,都可以立刻生效。
这里利用Oh my zsh的方法安装。直接一句话命令行里下载并移动到oh my zsh目录中:
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
然后在~/.zshrc
文件中找到plugins数组,加入zsh-autosuggestions
名字,重新打开终端即可。
将插件下载到oh my zsh的插件目录下的该新建插件同名文件夹中
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
编辑~/.zshrc
文件将然后将插件引用命令写入该文件最后一行(必须)
# Note the source command must be at the end of .zshrc
source "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
保存重新打开即可看到高亮的命令行了。
安装方法:
brew install autojump
# 未完待续...
Mac下的Sublime Text的位置是/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl
所以我们直接用alias别名引用它就好了。
Bash的话在~/.bash_profile
里,zsh的话在~/.zshrc
里,直接加入这句话:
alias subl="/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl"
然后就可以直接命令行里打开编辑器了:
subl ~/readme.txt
执行后会弹出Sublime Text编辑器,并打开readme.txt文件。
同理,换成其它编辑器,或在其它系统里,也是这样修改流程
开源视频处理几乎必用的一个程序,功能强大。
# for Ubuntu 14.04 (no need to install on 15.04)
sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install ffmpeg -y
nice -19 ffmpeg 各种参数
#
$ ffmpeg -i <FILE> -vn <OUT>
nice -19 ffmpeg -i input.webm -c:v libx264 -crf 20 -c:a aac -strict experimental out.mp4
# 不转码截取片段()
nice -19 ffmpeg -i "input.mp4" -ss 00:03:25 -to 00:05:42 -c copy "output.mp4"
nice -19 ffmpeg -i "input.mp4" -itsoffset 2.0 -i "input.mp4" -vcodec copy -acodec copy -map 0:0 -map 1:1 "output.mp4"
# ...
ffmpeg的参数顺序很重要, 不同的顺序造成截然不同的结果
# 从指定开始点到指定结束点
ffmpeg -i 文件名 -ss 01:00:00 -t 00:06:00 -vcodec copy -acodec copy 输出文件名
ffmpeg -i 文件名 -ss 00:01:00 -to 00:02:00 -c copy 输出文件名
# 从指定开始点到指定时长
ffmpeg -ss 00:01:00 -i 文件名 -to 00:02:00 -c copy 输出文件名
# 调整音频匹配不上的问题 #方法1
ffmpeg -i "test.mp4" -itsoffset 2.0 -i "test.mp4" -vcodec copy -acodec copy -map 0:0 -map 1:1 "new.mp4"
# 调整音频匹配不上的问题 #方法2: 一开始就分开截取音频视频 然后再合并
#
cd ~
进入用户主目录,cd 空格
也行;cd -
返回进前一个所在目录;cd ..
返回上级目录;cd ../..
返回上两级目录;cd !$
把上个命令的参数作为cd参数使用rm 文件名
删除文件rm -rf 文件夹
删除文件夹及其内所有文件之前说过了,一般终端的默认Shell只要在终端应用如Terminal.app,iTerm2等的系统设置里直接改就好了。
但是如果我们要用ssh登录服务器就不能这么设置了,需要用到chsh
这个命令。很简单
如果不懂的话,直接 man chsh
就可以看到很简单的描述--改变登录shell。
首先要查到当前机器有哪些以安装的shell,cat /etc/shells
。
我的默认有这些,可以看到zsh位于/bin/zsh
,那么如果想要将zsh改为默认,就直接在终端里输入:
chsh -s /bin/zsh
即可达到修改默认终端的效果。如果是ssh连接服务器的话,需要重连才能看到效果。
一开始是为了找翻屏(上下滚动)的快捷键,Windows和Linux上一般PageUp, PageDown即可,Macbook上没有这两个键,所以还挺难找的。后来查了一系列其它的终端快捷键,如下:
Cmd+Up
向上滚动Cmd+Dn
向下滚动Fn+Left
和Ctrl+A
一样,移到命令行最左端Fn+Right
和 Ctrl+E
一样,移动的命令行最右端Ctrl+U
删除当前命令行Ctrl+K
删除当前光标后的所有内容查看Stackovervlow, 发现答案,既可以使用sed+awk
来自己写解析读取json,也可以通过引用python方法来更方便的解析。推荐python方法,如下:
echo '{"hostname":"test","domainname":"example.com"}' | python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["hostname"]'
由于*nix都原生带有python,所以这么执行是没问题的。而且一般也不用考虑到执行速度问题。
快捷键 | 快捷键说明 |
---|---|
OOOOO | OOOOO |
CTRL-A | 将光标移到行首(在命令行下) |
CTRL-B | 退格 (非破坏性的),这个只是将光标位置往回移动一个位置。 |
CTRL-C | 中断,终结一个前台作业。 |
CTRL-D | “EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。 |
CTRL-E | 将光标移动到行尾(在命令行下) |
CTRL-F | 将光标向前移动一个字符(在命令行下) |
CTRL-G | BEL。在一些老式打印机终端上,这会引发一个响铃。在xterm终端上可能是哔的一声。 |
CTRL-H | 擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。 |
CTRL-I | 水平制表符。 |
CTRL-J | 新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘/012′)或十六进制形式(‘/x0a’)。 |
CTRL-K | 垂直制表符(Vertical tab)。在控制台或 xterm 窗口输入文本时,CTRL-K会删除从光标所在处到行尾的所有字符。在脚本中,也可能表示为八进制形式(‘/013′)或十六进制形式(‘/x0b’)。 |
CTRL-L | 跳纸,换页(Formfeed),清屏。清空终端屏幕。在终端上,这个命令的作用和clear命令一样。但当这个命令发送到打印机时,Ctrl-L会直接跳到纸张(Paper sheet)的末尾。 |
CTRL-M | 回车(Carriage return)。 |
CTRL-N | 擦除从history缓冲区召回的一行文本(在命令行下)。如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令。 |
CTRL-O | 产生一个新行(在命令行下)。 |
CTRL-P | 从history缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL-N都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N是从起点开始由远及近(如果起点是历史命令的话)。 |
CTRL-Q | Resume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S。 |
CTRL-R | 回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。 |
CTRL-S | Suspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL-Q。 |
CTRL-T | 交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var;,假设光标在a上,那么,按下C-T之后,v和a将会交换位置:echo $avr;。 |
CTRL-U | 擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入。 |
CTRL-V | 在输入文本的时候,按下C-V之后,可以插入控制字符。比如:echo -e '/x0a’;和echo |
CTRL-W | 当在控制台或一个xterm窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符。 |
CTRL-X | 在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中。 |
CTRL-Y | 将之前已经清除的文本粘贴回来(主要针对CTRL-U或CTRL-W)。 |
CTRL-Z | 暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。 |
CTRL-/ | 退出。和CTRL-C差不多,也可能dump一个”core”文件到你的工作目录下(这个文件可能对你没用)。 |
CTRL-/ | 撤消操作,Undo。 |
CTRL-_ | 撤消操作。 |
CTRL-xx | 在行首和光标两个位置间进行切换,此处是两个”x”字符。 |
ALT-B | 光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头)。 |
ALT-F | 光标往前跳一个词(移动到光标所在词的末尾)。 |
ALT-D | 删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词)。 |
ALT-BASKSPACE | 删除光标所在位置到词开头的所有内容。 |
ALT-C | 将光标所在位置的字母转为大写(如果光标在一个词的起始位置或之前,则词首字母大写)。 |
ALT-U | 将光标所在位置到词尾的所有字母转为大写。 |
ALT-L | 将光标位置到词尾的所有字母转为小写。 |
ALT-R | 取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行)。 |
ALT-T | 当光标两侧都存在词的时候,交换光标两侧词的位置。如:abc |
ALT-. | 使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的Bang命令中的词指示符概念)。 |
ALT-_ | 同ALT-.。 |
ALT-数值 | 这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数。如:[ALT-10,k]则光标位置会插入10个k字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT--10,CTRL-D]则向CTRL-D默认方向相反(负数)的方向执行10次操作。 |
ALT-< | 移动到历史记录中的第一行命令。 |
ALT-> | 移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空)。 |
ALT-P | 从当前行开始向前搜索,有必要则向”上”移动,移动时,使用非增量搜索查找用户提供的字符串。 |
ALT-N | 从当前行开始向后搜索,如果有必要向”下”移动,移动时,使用非增量搜索查找用户提供的字符串。 |
ALT-CTRL-Y | 在标志点上插入前一个命令的第一个参数(一般是前一行的第二个词)。如果有参数n,则插入前一个命令的第n个词(前一行的词编号从0开始,见历史扩展)。负的参数将插入冲前一个命令的结尾开始的第n个词。参数n通过M-No.的方式传递,如:[ALT-0,ALT-CTRL-Y]插入前一个命令的第0个词(命令本身)。 |
ALT-Y | 轮询到删除环,并复制新的顶端文本。只能在yank[CTRL-Y]或者yank-pop[M-Y]之后使用这个命令。 |
ALT-? | 列出能够补全标志点前的条目。 |
ALT-* | 把能够补全[ALT-?]命令能生成的所有文本条目插入到标志点前。 |
ALT-/ | 试图对标志点前的文本进行文件名补全。[CTRL-X,/]把标志点前的文本当成文件名并列出可以补全的条目。 |
ALT-~ | 把标志点前的文本当成用户名并试图进行补全。[CTRL-X,~]列出可以作为用户名补全标志点前的条目。 |
ALT-$ | 把标志点前的文本当成Shell变量并试图进行补全。[CTRL-X,$]列出可以作为变量补全标志点前的条目。 |
ALT-@ | 把标志点前的文本当成主机名并试图进行补全。[CTRL-X,@]列出可以作为主机补全标志点前的条目。 |
ALT-! | 把标志点前的文本当成命令名并试图进行补全。进行命令名补全时会依次使用别名、保留字、Shell函数、shell内部命令,最后是可执行文件名。[CTRL-X,!]把标志点前的文本当成命令名并列出可补全的条目。 |
ALT-TAB | 把标志点前的文本与历史记录中的文本进行比较以寻找匹配的并试图进行补全。 |
ALT-{ | 进行文件名补全,把可以补全的条目列表放在大括号之间,让shell可以使用。 |
mkdir <folder>
创建单层文件夹, 比如mkdir ./src
。不能创建多层,不能重复创建mkdir -p <path>
创建多层次文件夹,可以重复创建同一个文件夹。如mkdir -p ./src/s/e/w/asdf
目前剪切板的操作原生支持还不是很完善,windows/mac/linux的工具都不一样,而且如果不是自己写脚本的话很难原生支持剪切板里的图片读取和写入。
# 写入剪切板
$ echo 'hihihi' | pbcopy
#或
$ pbcopy < echo 'hello'
# 读取剪切板
$ pbpaste
# 保存剪切板内容到文件
$ pbpaste > ~/test.txt
目前没有原生支持剪切板的文字之外的类型。所以必须要下载第三方应用。
mac上直接brew install pngpaste
,完成后一句pngpaste path-to-img.png
即可在指定位置生成图片文件。没有特别option选项,仅此一句。
经过测试,能支持截图软件、浏览器、mac图片预览等的右键点击copy得来的常用图像。
官方的图像类型支持说明:
Supported input formats are PNG, PDF, GIF, TIF, JPEG
.
Supported output formats are PNG, GIF, JPEG, TIFF
.
Output formats are determined by the provided filename extension, falling back to PNG.
It's unclear if EXIF data in JPEG sources are preserved. There's an issue with pasting into JPEG format from a GIF source.
但是:
ctrl+c
这样拷贝来的图片原本是在linux常用的剪切板操控工具,后来可能流行起来在mac也支持了。但是mac上安装要麻烦点,必须要先安装依赖工具:X11
即XQuartz
,200M的安装文件,装完了还要重启mac电脑才行。不过为了剪切板的事,忍了。安装地址在这。下载好dmg文件安装就行了。
安装好后,用brew install xclip
即可轻松装好。
但是!!!
装好才发现,xclip并没有和系统剪切板沟通,而只是在自己程序里的一些缓存。而且而且而且!每次在命令行里用xclip,还都会在桌面启动XQuartz
这个app,还不会自动关闭。实在太不爽了这种设置。
另外,所有这些x开头的剪切板程序,都是建立在X Windows
基础上的,即刚刚安装的XQuartz。wiki这里有一个列表,所有xsel、xclip等等都是这样的。。。
难道mac和linux的小小剪切板就这么难操作吗?
$ df -h
就可以查看本地各处的存储情况了。下图是我的树莓派存储:# 注意是反引号 因为是要执行date命令
echo `date`
# 一个好用的技巧,快捷键commit
alias gc = "git add . && git commit -m \"`date`\" "
运行crontab -e
后会自动跳进程序,在最底下一行写入执行命令,必须要按照格式写。
格式是* * * * * 命令
,其中前五个星号分别代表着第几分钟、第几小时、每月第几日、哪个月、星期几。要按照顺序替换为一个数字,如果保持,则表示任意。
*还可以加运算符:
参考文章
*:任何时间
/:每隔多久
-:连续时间
,:不连续的时间
# 每2分钟执行
*/2 * * * * echo "hello" >> ~/test.txt
# 每天执行
**
我们可以用Python或Shell脚本动态修改crontab:
# 先导出crontab设置
$ crontab > ./tasks.txt
# 输入新的crontab设置到文件中 (也可以直接修改txt文件)
$ echo '# some new command' >> ./tasks.txt
# 导入(覆盖)到crontab中
$ crontab jobs.txt
# OR
$ cat jobs.txt |crontab
Crontab创建任务时报错:crontab: no crontab - using an empty one crontab: "/usr/bin/vi" exited with status 1
这个错误主要是没有在bash或zsh中指定文本编辑器的问题。
直接到~/.bash_profile
或~/.zshrc
文件中添加指定编辑器的语句即可:
export EDITOR=vim
退出后,重启Bash或者Zsh即可。
把程序运行在树莓派上时,获取的时间默认是美国的,这样记录日志之类的东西也都是美国时间会容易混淆。所以需要在命令行里修改系统时区。
我们在/usr/share/zoneinfo
这个文件夹里可以看到各种各样的国家和时区,找到自己的时区后拷贝到/etc/localtime
即可改变时区
# 中国是ROC
sudo cp /usr/share/zoneinfo/ROC /etc/localtime
# 验证
date
一般其实不需要改时间,联网的话默认是从网上获取的。 如果要改,参考这篇文章
tail
命令实时监控某文件变化一般我们在程序生成log日志时,会想到用
cat
去查看内容。但是要想在程序运行过程中实时查看内容的变化,cat就不够好了,总不能手动一遍一遍去查吧。tail
命令就可以解决这个问题,它让你像看直播看文件内容。
目前,
上面提到服务器的任务不间断运行,就是利用了tmux的特性。就是说,一般ssh是断开就会停止所有之前连接ssh期间运行的所有processes,而tmux的核心业务不在于把屏幕分成几块好看,而是它能保存session!而且还能多端实时直播session!
了解tmux的安装和使用已经理解,这个短视频足矣!如果想试试tmux的session共享,让别的机器或别人像直播一样看你在命令行里打字、操作,也用tmux一句话即可,参考这个视频。
我万万没想到,将vim打造成IDE、将脚本不间断运行、让任务运行状态多处可观看的tmux,是这么简单。
一句sudo apt-get install tmux
就安装好,一句tmux
就开启,一句tmux new -s <session-name>
就可以创建和保存session。超绝!
第一,Tmux中,千万不要去背和记长度超过1个字母的命令!所有都按照自己的顺手程度,在.tmux.conf
配置文件中绑定快捷键,甚至窗口改变大小的命令也不用记,只需改为用鼠标调整即可。
第二,在Tmux逻辑中,分清楚Server > Session > Window > Pane
这个大小和层级顺序是极其重要的,直接关系到工作效率:
tmux kill-server
来重启tmux。了解了这个逻辑后,整个Tmux的使用和配置也就清晰了。
(ps:下面这种方便好看的Status bar状态栏,显示的是windows,而不是sessions)
#启动新session:
$ tmux [new -s 会话名 -n 窗口名]
#恢复session:
$ tmux at [-t 会话名]
#列出所有sessions:
$ tmux ls
#关闭session:
$ tmux kill-session -t 会话名
#关闭整个tmux服务器:
$ tmux kill-server
所谓
内部命令
,就是进入Tmux后,并按下前缀键
后的命令,一般前缀键为Ctrl+b
. 虽然ctrl和b离得很远但是不建议改前缀键,因为别的键也不见得方便好记不冲突。还是记忆默认的比较可靠。
<前缀键>r
<前缀键>I
<前缀键>&
<前缀键>c
<前缀键>w
<前缀键>n
<前缀键>p
<前缀键>,
.
<前缀键>x
<前缀键>%
<前缀键>"
<前缀键>z
<前缀键>q
<前缀键>{
<前缀键>}
<前缀键>:new<回车>
<前缀键>s
<前缀键>$
和vim一样的思路,需要先安装tmux专属的插件管理器,一般都是用这个:tmux plugin manager
,即tpm。注意:文档里面都会提到prefix + ...
,其中prefix
指的是tmux的命令前缀,默认是ctrl+b
。
按照官网的做法,很简单就安装上了,输入下面命令:
# 把管理器文件安装到`~/.tmux/plugins/tpm`之下 此前这些目录是不存在的
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 新建配置文件
vim ~/.tmux.conf
# 将下面内容复制到`~/.tmux.conf`
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'git@github.com/user/plugin'
# set -g @plugin 'git@bitbucket.com/user/plugin'
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
在tpm管理器已经安装的基础上:
~/.tmux.conf
文件里的List of plugins
部分,写入插件名称<前缀键>I
,这里面是大写的i,下载更新插件<前缀键>r
重新加载配置文件然后Tmux就完成配置更新了。
Tmux的配置文件
配置文件默认位于~/.tmux.conf
.
日常使用中,前缀键Ctrl+b
和切换窗口键Ctrl+o
等等,实在太麻烦了。所以改快捷键有时候是很必要的。
参考这篇文档。
我的配置如下:
# 基础设置
#set -g default-terminal "screen-256color"
set -g default-terminal "xterm-256color" # recover colorful terminal
set -g display-time 3000
set -g escape-time 0
set -g history-limit 65535
set -g base-index 1
set -g pane-base-index 1
# 前缀绑定 (Ctrl+a)
#set -g prefix ^a
#unbind ^b
#bind a send-prefix
# 启用鼠标(Tmux v2.1)
set -g mouse on
# 选中窗口
bind-key k select-pane -U
bind-key j select-pane -D
bind-key h select-pane -L
bind-key l select-pane -R
# copy-mode 将快捷键设置为 vi 模式
setw -g mode-keys vi
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# Tmux Plugin Manager(Tmux v2.1)
#== TMUX PLUGIN MANAGER ==#
# Tmux Resurrect
set -g @plugin 'tmux-plugins/tmux-resurrect'
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
这个主要是由于Tmux的后台缓存机制造成的。我就犯了个大错误:甚至删了Tmux、重装Tmux、重启电脑,都没达成。
Tmux会有一个叫Tmux-server
的东西。只要把它kill,重启tmux就OK了:
$ tmux kill-server -a
它虽然好用,但是缺点是关机的话session就全都消失了。要解决这点,需要安装单独的插件。
这个时候你就需要Tmux-Resurrect
插件来了,地址在这。
插件说明里很清楚的写了,tmux一旦关机,就会失去一切的设置。所以还必须用插件来解决。
这是因为tmux默认TERM没有用256color,那么每次运行tmux时指定color即可,TERM=screen-256color-bce tmux
,或者更简单一点,在~/.bash.profile
或者~/.zshrc
中设置别名:
alias tmux="TERM=screen-256color-bce tmux"
然后在~/.tmux.conf
文件中加入这句话:
set -g default-terminal "xterm-256color"
tmux中鼠标滚屏默认是关闭的,且不是很容易像开关一样开启支持。
看过了一些stackoverflow尝试了一些解决方案,发现没有一个管用。如果比这个还麻烦,暂时我就觉得没有必要再折腾了,直接用原生的屏幕滚动浏览快捷键即可:
Prefix + [
,然后直接用上下箭头,或者PnUp
和PnDown
即可
[exited]
这个是因为没有安装reattach-to-user-namespace
且.tmux.conf
中配置了set-option -g default-command "reattach-to-user-namespace -l zsh"
造成的。
重新安装reattach-to-user-namespace
即可:
$ brew install reattach-to-user-namespace
通过ssh登录服务器运行一个python脚本,想让它24小时不间断运行。可是一旦我退出ssh,整个程序就断了。这是由于ssh的session特性——它本身就是一个session,连接上开启session,断开ssh连接则关闭session,关闭时所有你在这个session里运行的东西都会被中断。
很幸运,在学习怎么把vim分屏浏览时知道了tmux,然后看视频时学到:原来ssh是这样的特性,断开就会停止所有之前连接ssh期间运行的所有processes,而tmux的核心业务不在于把屏幕分成几块好看,而是它能保存session!而且还能多端实时直播session!
网上一般说到不间断任务,一般也都会先提到这个,可以说是常规方案。
nohup
一般都是Linux系统自带的,使用极其简单:
$ nohup 具体指令 &
加&
是让其转入后台运行,而不在前台显示。
这据说是现在更常用的方法,参考文章。
据说的最简单方案:在命令后加&
或者用ctrl+z
把任务转到后台,然后用disown -a
将任务解除与当前session的关联(意思就是当前session关闭也不影响它)
echo $RANDOM
即可生成一个5位数的随机数。
# 查看某目录或文件的大小(目录的话默认显示里面所有文件的大小)
$ du <file-or-folder>
# 只查看某文件夹自身的总大小("-d 0"代表max depth为0)
$ du -d 0 <folder>
# 指定size单位查看(如k, M, G等)
$ du -d 0 -h <folder>
man page
实际上不需要各种cheatsheet,Linux上自带就有手册,
man page
。
man page
其实就是Manual Page的意思,使用方法是man 命令
,然后就会显示某个命令的所有官方说明和用法。这个是基础中的基础。
但是苦于Man Page和历史上所有的说明书一样,实在是太官方太枯燥了,所以我们可以看到一些衍生品:
TLDR
TL;DR
的意思是Too long; Dont' read. 这个词在写文章时代表接下来要出现一个很长的内容了,但是在Linux中其实代表着相反的意思:把大长篇的说明简化为两三句话,直入重点展示命令的用法。
tldr
是Linux命令行工具,官网在此。安装方式如下:
# Mac
brew install tldr
# Linux
sudo pip install tldr
注意:各种设备、平台上的安装方法都不同,请到官网看详情。
bropage
相当与tldr
的社区版,即社区可以贡献每种命令的使用事例,然后通过投票方式排名。所以bropage每次执行都是需要联网查询的。
用法是:bro 命令
brew doctor
用来检测当前环境问题。
因为老登录服务器和树莓派什么的,默认bash实在太难看,tab补全也不好用,所以希望一连接就直接用zsh。
方法很简单:更改/etc/passwd
这个文件。
看样子那个文件是保存密码似的,其实真不是,就一堆明文的各用户配置,其实也看不懂每行什么意思,如下:
因为是系统文件,所以需要root权限,这时用
sudo vim /etc/passwd
打开文件进行编辑,找到自己当前的用户名那一行,把最后的/bin/bash
改成/bin/zsh
即可。保存退出,重新登录连接服务器,哒哒!完成。
sudo apt-get install
安装时报错Could not get lock /var/lib/dpkg/lock
之前因为sudo apt-get install
安装什么东西,然后按键终止掉了安装,结果就一直被锁住。
解决方案参考文章。
sudo rm /var/lib/dpkg/lock
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
于是按照系统提示的解决方法输入命令,如下:
sudo dpkg --configure -a
3.这时虽然可以启动安装程序了,但是运行到最后往往还是会报这个错误:
Errors were encountered while processing:
cups
ssl-cert
sudo
E: Sub-process /usr/bin/dpkg returned an error code (1)
尝试了网上无数种apt-get purge, clean, -f install等等等等,都不行。 于是看到了一篇中文文章两句话解决:
# 删除锁
sudo rm -r /var/lib/dpkg/info/
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
# 重新配置
sudo mkdir /var/lib/dpkg/info
sudo dpkg --configure -a
意思是,主要出错原因在于/var/lib/dpkg/info/
文件夹,把它备份或删掉就好了,然后再创建一个同名文件夹。
之后sudo apt-get upgrade
升级试试,一切完好!
Exiftool 是命令行操作exif最强大的工具。
参考:图片EXIF信息查看与Exiftool使用 参考:如何批量将图片文件名中的时间写入 EXIF 信息? 知乎
安装:
# Mac上安装
$ brew install exiftool
# 或Linux上安装
$ sudo apt-get install exiftool
# 查看图片全部exif信息
$ exiftool 图片位置
# 查看图片某个tag信息
$ exiftool -tag
每种格式的图片都有自己不同的一堆Tags,比如时间、日期、地理位置等,jpg和png都很不一样。 所以到官网参考每种图片的不同tags,才能确定自己要怎么改这个信息。
注意,引用tag时,要用小写。
基本语法是一样的:
-tag=VALUE
-tag+=VALUE
或-tag-=VALUE
-tag=
$ exiftool -artist=solomon
但是有一点一定要注意:每种tag所接受的值的格式是很严格的:
$ exiftool photo.jpg #查看所有信息
$ exiftool -a -u -g1 photo.jpg #查看所有元信息,包括重复和未知标签,并按小组排列
$ exiftool -s -ImageSize -ExposureTime photo.jpg #查看图片尺寸
$ exiftool -common dir #查看dir目录文件信息(不仅仅是图片)
$ exiftool -l c.jpg d.jpg #从两个图像文件打印所有信息。
$ exiftool -l -canon c.jpg d.jpg #从两个图像文件打印标准的佳能信息。
更改创建和修改时间:
$ exiftool -gps:all="" photo.jpg #有些相机会记录拍照时的GPS定位信息。如果你不希望别人看到使用该命令删除gps信息
$ exiftool -all="" photo.jpg #删除所有信息
$ exiftool -all="" --exif:all photo.jpg #删除EXIF以外的所有信息
写入标签:
$ exiftool -artist=标签名称 photo.jpg #写入艺术家标签
$ exiftool -artist=标签名称 a.jpg b.jpg c.jpg #写多个文件
$ exiftool -artist=标签名称 /exiftoolTest #写在一个目录的所有文件 exiftoolTest为文件夹
转移标签「<」(将某一个标签值赋予另一个标签):
# 将文件名(带日期的)设置到图片日期中(程序会自动识别日期格式)
$ exiftool "-DateTimeOriginal<filename" "2009-09-30 15-28-16.jpg"
# 将文件名设置为文件大小(带格式)
$ exiftool "-filename<%f_$imagesize.%e" IMG_0894.JPG
其它:
$ exiftool -Comment='这是一个新的评论'dst.jpg
向JPG图片写入新评论(取代任何现有评论)。
$ exiftool -comment='' -o newdir -ext jpg
删除当前目录中所有JPG图像的评论,
将修改后的图像写入新目录。
$ exiftool -keywords=EXIF -keywords=编辑器 dst.jpg
用两个新的关键字(“EXIF”和。)替换现有的关键字列表
“编辑”)。
$ exiftool -Keywords+=单词 -o newfile.jpg src.jpg
将源图像复制到新文件,然后添加关键字(“单词”)
当前关键字列表。
$ exiftool -credit=xxx dir
从一个目录中的所有文件中删除信用信息,信用值是“xxx”。
$ exiftool -all='' dst.jpg
从图像中删除所有元信息。注意:你不应该
对RAW图像(DNG除外)进行处理,因为它是专有的RAW图像
格式通常包含制造注释中的信息
转换图像所必需的。
$ exiftool -all='' -comment ='寂寞' dst.jpg
删除图像中的所有元信息并添加评论
(注意顺序很重要:“-comment ='lonely'-all =”
也会删除新评论。)
$ exiftool -all = --jfif:全部dst.jpg
从图像中删除除JFIF组以外的所有元信息。
$ exiftool -Photoshop:全部= dst.jpg
从图像中删除Photoshop元信息(注意
Photoshop信息还包括IPTC)。
$ exiftool -r -XMP-crss:all = DIR
递归删除a中的图像中的所有XMP-crss信息
目录。
$ exiftool'-ThumbnailImage <= thumb.jpg'dst.jpg
从指定的文件中设置缩略图(注意:引号是
以防止外壳重定向)。
$ exiftool'-JpgFromRaw <=%d%f_JFR.JPG'-ext NEF -r。
递归地写入以“_JFR.JPG”结尾的文件名的JPEG图像
添加到扩展名为“.NEF”的类似文件的JpgFromRaw标记中
当前目录。 (这是“-JpgFromRaw”的倒数
上面的“READING EXAMPLES”部分的命令)。
$ exiftool -DateTimeOriginal - ='0:0:0 1:30:0'dir
调整目录“dir”中所有图像的原始日期/时间
减去1小时30分钟。 (这相当于
“-DateTimeOriginal- = 1.5”。请参阅Image :: ExifTool :: Shift.pl
细节。)
$ exiftool -createdate + = 3 -modifydate + = 3 a.jpg b.jpg
向两个CreateDate和ModifyDate时间戳添加3个小时
图片。
$ exiftool -AllDates + = 1:30 -if'$ make eq“Canon”'dir
移动DateTimeOriginal,CreateDate和ModifyDate的值
将所有佳能影像转换1小时30分钟
目录。 (AllDates标签作为这些的快捷方式提供
三个标签,允许他们通过一个标签访问。)
$ exiftool -xmp:city = Kingston image1.jpg image2.nef
将标签写入两个图像的XMP组。 (没有“xmp:”
自从“City”存在以后,该标签将被写入IPTC组
在这两种情况下,IPTC默认是首选。)
$ exiftool -LightSource - ='未知(0)'dst.tiff
只有在值为0时才删除“LightSource”标签。
$ exiftool -whitebalance- = auto -WhiteBalance = tung dst.jpg
只有之前为“自动”时,才将“WhiteBalance”设置为“Tungsten”。
$ exiftool -comment- = -comment ='新评论'a.jpg
只有当图片还没有时才写新评论。
$ exiftool -o%d%f.xmp目录
为“dir”中的所有图像创建XMP元信息数据文件。
$ exiftool -o test.xmp -owner = Phil -title ='XMP File'
仅从命令中定义的标签创建XMP数据文件
线。
因为编辑exif信息需要知道图片里内置的各种标签名才能修改,所以下面为标签名参考。
Comment
: 描述,无字数限制。Comment
: 描述,无字数限制。Description
:描述,无字数限制。参考 Pandoc Demos 官方收集的各种模板: User contributed templates
# Markdown to Microsoft word .docx
$ pandoc FILENAME --to docx -o FILENAME.docx
一般来说,简单一句就够了:
$ pandoc in.md -o out.html
但是,页面丑爆了!所以我们必须加上模板来渲染出漂亮的页面,比如Github风格的markdown页面。 但是这就有一些些复杂了。
这里我们采用GitHub Pandoc HTML5 Template
模板,地址在此:
https://github.com/tajmone/pandoc-goodies/tree/master/templates/html5/github
需要把这个目录中所有文件复制到~/.pandoc/templates/
文件夹下:
如果本地没有这个文件夹,就自己创建一个。复制好之后,就可以直接引用名字来生成渲染过的markdown网页了:
$ pandoc --template=Github.html5 in.md -o out.html
mv
# 移动指定的多文件 (最后一个即终点)
mv file1 file2 file3 DESTINATION
# 根据查找结果移动多文件
mv `ls|grep IDENTIFIER` DESTINATION
# or
mv *.doc /path/to/dest/folder/
# 重命名文件夹
mv old_folder_name new_folder_name
# 重命名文件
mv old_file_name new_file_name
You have new mail
查了下才知道,原来不是我的邮箱,而是另一种新建,一种叫mail
的命令保存的信件。
它的创建应该是和创建的crontab
任务有关系。
输入mail
命令,一条一条看完,就不会再显示了。
命令行里输入长命令时,真是个pain。不能跳词,不能用鼠标,只能按左右键一个字母一个字母移动,实在是挺费劲的。
实际上非常非常简单,完全无需额外下载什么插件,都是内置功能。
如果Bash终端的话,只要在~/.bash_profile
或~/.bashrc
中加入这个命令:
set -o vi
如果是Zsh,则在~/.zshrc
中加入:
bindkey -v
export KEYTIMEOUT=1
参考视频:TFW You Learn There's a Vim Mode in Bash...
具体使用:
我使用的iTerm2+Zsh终端,已经进入了vi模式。但是屏幕上没有任何显示当前是Normal
模式还是Insert
模式。所以经常不知道自己在什么模式,还是有点不习惯。
使用上,完全和vi相同。
find
命令可以在指定目录及里面所有子文件夹的文件里搜索。不光可以按文件名搜索,还可以结合根据内容搜索。
# 「文件名模糊搜索」
$ find . -name '*.jpg'
# 「类型为文件」
$ find . -type f
# 「类型为目录」
$ find . -type d
# 「空目录」
$ find . -empty
# 「包含文件」查找包含某个文件的目录 (利用test命令)
$ find . -type d -exec test -e "{}/index.html" \;
# 「包含文件」查找同时包含某几个文件的目录 (利用test命令的组合参数)
$ find .type -d -exec test -e "{}/a.jpg" -a -e "{}/b.jpg" \;
# 从指定目录里查找
$ find . -path "*folder*"
# 限制查找深度
$ find ./ -name "*.txt" -maxdepth 2
# 按文件大小查找 (b, k, M, G)
$ find . -size +1M
$ find . -size -100k
# OR / AND条件判断组合查找 (-a是AND,-o是OR,然后用括号扩起来)
$ find . -name "fileA" -o \( -name "fileB" \)
根据文件内容搜索: 参考:Linux查找目录下的所有文件中是否含有某个字符串
# 「内容中包含关键字的文件」
$ find . -name '*.txt' | xargs grep -ri 'KEYWORD'
# 「批量压缩」查找所有包含指定文件的文件夹,并压缩该文件夹
$ find . -type d -exec test -e '{}/index.html' \; -exec zip -r {}.zip {} \;
# 「批量移动」移动找到的内容
$ find . -name "*.mp4" -exec mv {} /path/to/destination/ \;
# 「批量重命名」重命名找到的内容
$ find . -name "*.mp4" -exec ......
$ find . -not \( -path ./exclude/ -prune \)
注意:-not \( -path ./exclude/ -prune \)
不能和-delete
结合使用,如果要删除,需要用-exec rm {} \;
两步搞定:
$ sudo vim /etc/apt/sources.list
# 然后把源的一条一条的地址复制进去 保存即可
# 更新索引清单
$ sudo apt-get update
# 更新依赖关系
sudo apt-get upgrade -y
deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib rpi
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib rpi
#sohu shangdong
deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
#163 guangdong
deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
#aliyun
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
#tsinghua.edu
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse
#neu.edu
deb-src http://mirror.neu.edu.cn/ubuntu/ xenial main restricted #Added by software-properties
deb http://mirror.neu.edu.cn/ubuntu/ xenial main restricted
deb-src http://mirror.neu.edu.cn/ubuntu/ xenial restricted multiverse universe #Added by software-properties
deb http://mirror.neu.edu.cn/ubuntu/ xenial-updates main restricted
deb-src http://mirror.neu.edu.cn/ubuntu/ xenial-updates main restricted multiverse universe
deb http://mirror.neu.edu.cn/ubuntu/ xenial universe
deb http://mirror.neu.edu.cn/ubuntu/ xenial-updates universe
deb http://mirror.neu.edu.cn/ubuntu/ xenial multiverse
deb http://mirror.neu.edu.cn/ubuntu/ xenial-updates multiverse
deb http://mirror.neu.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirror.neu.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirror.neu.edu.cn/ubuntu/ xenial-security main restricted
deb-src http://mirror.neu.edu.cn/ubuntu/ xenial-security main restricted multiverse universe
deb http://mirror.neu.edu.cn/ubuntu/ xenial-security universe
deb http://mirror.neu.edu.cn/ubuntu/ xenial-security multiverse
ImageMagick
是Linux上超强大、功能超丰富的图片处理的命令行工具。
而ImageMagick
在做PDF相关的工作时,是基于Ghostscript
进行处理的。所以两个都要安装。
首先确保本机已经安装ImageMagick与Ghostscript,
Mac安装:
brew install ghostscript imagemagick
Ubuntu安装:
sudo apt-get install -y ghostscript imagemagick
# on error: sudo apt-get update
安装好后,命令行里就可以调用ImageMagick的一系列命令了,包括:
常用命令有:
#JPG图片转为PNG图片
$ convert image.jpg image.png
#将图片缩放为50%大小
$ convert image.png -resize 50% image2.png
#将图片缩放为指定长宽
$ convert image.png -resize 640x480 image2.png
#横向合并图片
$ convert image1.png image2.png image3.png +append image123.png
用imagemagick
将pdf转成图片(不是提取图片)的命令是:
$ convert sample.pdf sample.jpg
命令非常简单,速度也极快。但是在PDF转图片的过程中,如果不加任何设置直接convert xx.pdf xx.png
这样的转换,效果可是非常之差,如下图:
注意:一般如果设置输出为png的话,程序会提出警告:
convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG sample-default-convert.png' @ warning/png.c/MagickPNGWarningHandler/1744.
这是因为程序没有很好支持PNG
格式图片的问题。虽然报错,但是png文件也能正常生成。如果不喜欢的话,就改成JPG
格式输出好了。
convert
命令将PDF转图片的最大难度在于清晰度问题。网上有很多种解决方案,各有优缺。
以下为一些尝试的总结:
# 默认转换:图片大小几乎与pdf相同
$ convert sample.pdf sample.jpg
# resize设置:无论resize 100还是3000,都没有清晰化
$ convert -resize 3000 sample.pdf sample.jpg
# quality设置:完全没有作用
$ convert -quality 100% sample.pdf sample.jpg
# verbose+density+quality+flatten+sharpen转换:也就大概还原了80%的清晰度
$ convert -verbose -density 150 -trim -quality 100 -flatten -sharpen 0x1.0 sample.pdf sample.jpg
# density 300转换:100%还原,但是文件增大10倍
$ convert -density 300 -trim -quality 100 sample.pdf sample.jpg
# geometry 转换:100%还原,文件增大7倍
$ convert -geometry 1600x1600 -density 200x200 -quality 100 sample.pdf sample.jpg
总结:经过各种考察,中外网友对convert
转换图片的清晰度设置,也全都在猜的阶段。而且设置都太固定,并不能稳定保证所有的PDF都转换成一样的清晰度。
所以问题需要转换另一个思路去解决:
直接提取PDF中的原画,这样就100%是原画质了。
而且一般对于扫描书籍的PDF来说,全页只有一个图片,所以用pdfimages
就比较好解决。
这个需要另一个命令行工具pdfimages
来做到了。
请参考另一篇相关笔记。
cd /path/to/images/
convert "*.{png,jpeg,jpg}" -quality 100 outfile.pdf
pdfimages
来提取PDF中的图片pdfimages
是一个非常简便好用的PDF图片提取工具,很简单的一个命令就可以提取出PDF指定页面里的所有图片。但是,
注意:
pdfimages
只能提取
PDF中的图片,和imagemagick
的生成
图片有本质上的不同!也就是说,如果PDF中的内容不是图片的话,那么就提取不出来。
安装:
pdfimage
是poppler-utils
工具的一个子集,所以需要安装poppler-utils
或poppler
才能使用。Mac上,直接homebrew:
$ brew install poppler
安装好后就可以用pdfimages
命令了,用法如下:
# 提取出来的图片保存为默认的. ppm格式文件 (图片文件巨大,会比pdf文件大23倍左右)
$ pdfimages sample.pdf img_name
# 设定提取的图片保存为png格式 (图片大小是3倍左右)
$ pdfimages -png sample.pdf img_name
# 提取某一页的图片 (last one page)
$ pdfimages -l 3 sample.pdf img_name
# 提取前几页的图片(first number of pages)
$ pdfimages -f 2 sample.pdf img_name
提取的图片,会按照指定的位置和名字生成如img_name-000.jpg, img_name-001.jpg, img_name-002.jpg
这样的文件,每一个图片都对应着PDF中原始的图片。
如果没有图片,则不输出。
pdftk
是非常好用的PDF页面操作工具,能够切割、合并、提取指定页面等。
注意:pdftk
在命令行中算中量级应用,70MB+。
参考:PDF 合并和分割工具--PDFtk 参考官网:PDFtk server: the pdf tool kit
常用包括的功能如下:
Linux上安装:
$ sudo apt-get install pdftk
Mac上安装:因为它对Homebrew支持还不算特别好,所以需要使用一键脚本安装:
$ brew install https://raw.githubusercontent.com/youtux/homebrew-binary/pdftk/pdftk.rb
如果不成功,则在官网下载pkg包,在桌面双击安装:
https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk_server-2.02-mac_osx-10.6-setup.pkg
目前我的测试中只有双击安装pkg包能成功。
#提取1-15页为一个文件
$ pdftk input.pdf cat 1-15 output new.pdf
#提取第1至3,第5,第6至10页,并合并为一个pdf文件
$ pdftk input.pdf cat 1-3 5 6-10 output combined.pdf
#合并(concatenate) 前面所有的pdf为output.pdf
$ pdftk file1.pdf file2.pdf ... cat output new.pdf
#拆分PDF的每一页为一个新文件 并按照指定格式设定文件名
$ pdftk input.pdf burst output new_%d.pdf
#按照通配符,合并大量PDF文件
$ pdftk *.pdf cat output combined.pdf
#去除第 13 页,其余的保存为新PDF
$ pdftk in.pdf cat 1-12 14-end output out1.pdf
#扫描一本书,odd.pdf 为书的全部奇数页,even.pdf 为书的全部偶数页,下面的命令可以将两个 pdf 合并成页码正常的书
$ pdftk A=odd.pdf B=even.pdf shuffle A B output collated.pdf
#按180°旋转所有页面
$ pdftk input.pdf cat 1-endsouth output output.pdf
#按顺时针90°旋转第三页,其他页不变
$ pdftk input.pdf cat 1-2 3east 4-end output output.pdf
#输入密码转换成无密码PDF
pdftk secured.pdf input_pw foopass output unsecured.pdf
大概流程是:
# 提取信息
$ pdftk sample.pdf dump_data output info.txt
# 修改信息
# ...
# 把更改的信息加载回PDF
$ pdftk sample.pdf update_info info.txt output sample2.pdf
重新在mac上安装pdftk时,每次执行都会卡住不动,也不报错。
根据查询这篇回答:https://stackoverflow.com/questions/39750883/pdftk-hanging-on-macos-sierra
MacOS 10.12 Sierra上推荐安装pdftk_server-2.02-mac_osx-10.11-setup.pkg
版本,即El Capitan (10.11)的版本。且这个版本支持高至MacOS 10.13。
官方下载地址为:https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk_server-2.02-mac_osx-10.11-setup.pkg
# 下载多个链接 --input-file
$ wget -i List.txt
# 下载到指定目录 --directory-prefix
$ wget <url> -P ./folder
# 强制按照url的层级结构,创建多层目录 --force-directories
$ wget <url> -x
# 不覆盖已有文件 --no-clobber
$ wget <url> -nc
# 输出log下载日志 小写o,--output-file
$ wget <url> -o logname
# 保存文件为指定的名字 大写O, --output-document
$ wget <url> -O filename
# 限速下载
$ wget <url> --limit-rate 300k
# 每次下载都等待3秒
$ wget <url> --wait 3
# 每次下载随机等待0~2秒之间
$ wget <url> --random-wait
# 每次重新连接retry时等待1秒
$ wget <url> --waitretry 1
# 响应超时为5秒 --timeout
$ wget <url> -T 5
# 打印调试输出 --debug
$ wget <url> -d
# 不输出信息 --quiet
$ wget <url> -q
pdftohtml
同样是超强命令行工具集poppler
的一个子集,和pdfimages
等优秀的子集一样。用好了是非常便利的。
需要理解的是,pdftohtml
对扫描版PDF
是没什么用对。它的主要功能是把pdf中元素全部提取出来,然后按照布局生成HTML。但是扫描版的相当于是一张图片,没有任何元素信息。
Mac上,直接homebrew:
$ brew install poppler
安装好poppler
工具集后,就可以用pdftohtml
命令了。
常用命令:
# 默认输出 (生成多个互相嵌套的html文件,以及多个图片
$ pdftohtml sample.pdf sample.html
# 生成"复杂"排版,其实就是更精确排版的意思 --complex
$ pdftohtml -c sample.pdf sample.html
# 指定第一页至最后一页区间:first-last
$ pdftohtml -f 1 -l 2 sample.pdf sample.html
效果: 效果还好,即使是中文的,排版也没有偏离很远。 程序会自动生成很多很多很多的html和图片文件,全都在一个文件夹里面不分类。
# -v参数verbose
$ mv -v ./src/* /tmp
# -v 和-r参数 注意文件列表太多的话会不执行
$ rm -vr <from> <to>
# -v 和-r参数 verbose & recursive
$ cp -vr <from> <to>
# 使用rsync命令代替
$ rsync -avP <FROM> <TO>
rsync
主要语法是cat>文件名<<EOF
,然后把多行文字放在下面,并以EOF
结束。
示例test.sh
:
cat>~/text.txt<<EOF
第一行文字
第二行文字
第三行文字
EOF
如果需要追加文本,那就变成cat>>
:
cat>>~/text.txt<<EOF
第一行文字
第二行文字
第三行文字
EOF
执行bash脚本:
$ bash test.sh
# 查看生成到脚本
$ cat ~/text.txt
这是个很大的话题。实际上我都用了Linux很久了但根本不知道什么权限。只是现在感兴趣来看一看罢了。所以我打算用最简单的方式记录一下基本概念和用法。
Linux改密码异常简单,一个词就可以进入互动命令,输入新老密码。
$ passwd
# 显示第3行
$ head -3 filename.txt |tail -1
命令行一般都很长,用左右键一个字母一个字母移动实在太慢。 这里总结一些命令行常用的移动技巧。
Ctrl + ←
向左移动一个单词Ctrl + →
向右移动一个单词
积累终端命令行相关经验,包括Shell中的bash,zsh,终端中的Terminal, Mac Terminal.app,iTerm等
注意:这里说linux,linux之类的,其实在mac中也ok。只不过说起来和搜索起来方便而已。
涉及领域