man rename
查看使用方法)ln -s source_file target
创建软连接)
# 第一个错误,漏掉了文件名
# 程序静止在这,等待用户的进一步输入
# ctrl+c杀掉当前命令
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' | tail -n 3
^C
# 第二个错误,文件名和单引号之间没有空格,使得sed判断命令错误
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//'ehbio.fa | tail -n 3
sed:-e 表达式 #1,字符 11:“s”的未知选项
# 正确操作,
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
HAHA
,使用cut
命令 (cut更适合与矩阵操作,去除其中的一列或者多列)。
-f 2
(取出第2列),-f 2-5
(取出第2-5列),-f 2,5
(取出第2和第5列)。ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
# 管道符的使用
# 第一个命令的输出作为第二个的输入
# 前面的例子中也有使用
# tr: 是用于替换字符的,把空格替换为换行,文字就从一行变为了一列
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n'
1
2
3
# cat命令之前也用过,输出一段文字
# diff是比较2个文件的差异的,需要2个参数
# - (短横线)表示上一个命令的输出,传递给diff
# < 表示其后的命令的输出,也重定向给diff
ct@ehbio:~$ cat < 2
> 3
> 4
> END
0a1
> 1
3d3
< 4
# 如果不使用管道和重定向标准输入,程序是这么写的
# 先把第一部分存储为1个文件
ct@ehbio:~$ cat <firstfile
2
3
> 4
> END
ct@ehbio:~$ less firstfile
# 再把第二部分存储为1个文件
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n' >secondfile
# 然后比较
ct@ehbio:~$ diff firstfile secondfile
0a1
> 1
3d3
< 4
ct@ehbio:~$ echo "actg aaaaa cccccg" | tr ' ' '\n' | wc -l
3
# sed =:先输出行号,再输出每行的内容
ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed =
1
a
2
b
3
c
# 后面这个命令不太好解释
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把换行符替换为\t
ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed = | sed 'N;s/\n/\t/'
1 a
2 b
3 c
# 后面这个命令不太好解释
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed = | sed 'N;s/^/>/'
>1
a
>2
b
>3
c
# 把多条序列转成FATSA格式
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
# 于是FASTA格式序列就出来了
ct@ehbio:~$ echo "actg aaaaa cccccg" | tr ' ' '\n' | sed = | sed 'N;s/^/>/'
>1
actg
>2
aaaaa
>3
cccccg
# 输入一个命令
ct@ehbio:~/ehbio_project$ #cut -f 1 -d ' ' ehbio.fa | tail -n 4
# !!表示上一条命令
# :gs表示替换,把上一个命令中全部的ehbio替换为ehbio3; g: global; s: substitute
ct@ehbio:~/ehbio_project$ !!:gs/ehbio/ehbio3
#cut -f 1 -d ' ' ehbio3.fa | tail -n 4
# 替换后效果如上
# 去掉命令前的#号
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio3.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
## 替换ehbio3为ehbio4,直接运行命令
ct@ehbio:~/ehbio_project$ !!:gs/ehbio3/ehbio4
cut -f 1 -d ' ' ehbio4.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
Linux下文件有一个特殊的属性即可执行属性,用来指示这个文件是一个可执行的脚本或可以运行的二进制文件。前面所提到的这些命令,都具有可执行属性。
rwx
中r
表示read
(数字表示为4)、w
表示write
(数字表示为2)、x
表示执行 (数字表示为1)。三个为一组,连续出现三次(如下面命令行中所示), 第一组表示文件的所有者拥有的权限,第二组为文件所有者所在的用户组所拥有的权限,组内所有成员都具有的权限,第三组为其它用户的权限。
chmod a+x file
: 表示给文件增加所有人(a)可执行权限 (+x)chmod u+x file
: 表示给文件增加所有者(u,user,)可执行权限 (+x)chmod g+x
, chmod o+X
: 表示给文件增加组内人或其它人可执行权限chmod 755 file
: 表示拥有者有可读写执行权限,其它人有可读执行权限。(7=4+2+1
; 5=4+1
)/usr/bin
目录,大部分的系统命令都在这个目录下。
PATH
,其内容可通过下面的命令显示 (根据操作系统不同和配置不同,略有差别,但格式是统一的,:
分割的一堆路径):ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
/
开头或已~
开头的路径。~/.bash_profile
(不是~/.bashrc
)会自动被读取,所以需要把export
语句加入到这个文件中。python
命令,我们自己又安装了一个python
(假如在/home/ct/anaconda/bin目录下),如果我们想执行自己的python
程序,就需要把/home/ct/anaconda/bin
写在$PATH
前面,如下# 注意$PATH的顺序
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ export PATH=/home/ct/anaconda/bin:$PATH
PATH
只是众多环境变量中的一个变量,用于存储可执行文件所在的目录,以便在用户输入命令时可以查询的到。尤其是自己写的脚本或安装的程序,系统不会知道它们在哪个路径下,需要我们去提供给系统这些新的路径,学名叫设置环境变量。LD_LIBARY_PATH
: 指定动态链接库 (so文件)的位置,一般在安装软件出错时会用到;PYTHONPATH
: 指定Python的安装包的路径;PERL5LIB
: 指定perl的安装包的路径。sort -u
: 去除重复的行,等同于sort | uniq
。OFS
: 输出文件的列分隔符 (output file column separtor);FS
为输入文件的列分隔符 (默认为空白字符)。awk
中的列从第1到n列,分别记录为$1
, $2
… $n
。BEGIN
表示在文件读取前先设置基本参数;与之相对应的是END
,只文件读取完成之后进行操作。不以BEGIN
, END
开头的{}
就是文件读取、处理的部分。sed
和tr
都为最常用的字符替换工具cp
(本地硬盘)或scp
(远程硬盘)命令,给自己的结果文件新建一个拷贝;每有更新,再拷贝一份。crontab
程序中,设置每天的晚上23:00执行。对于远程服务器的备份,可以配置免密码登录,便于自动备份。后台输入免密码登录服务器,获取免密码登录服务器的方法。# Crontab format
# Minute Hour Day Month Week command
# * 表示每分/时/天/月/周
# 每天23:00 执行cp命令
0 23 * * * cp -fur source_project project_bak
# */2 表示每隔2分分/时/天/月/周执行命令
# 每隔24小时执行cp命令
0 */24 * * * cp -fur source_project project_bak
0 0 */1 * * scp -r source_project user@remote_server_ip:project_bak
# 另外crotab还有个特殊的时间
# @reboot: 开机运行指定命令
@reboot cmd
rsync:
是一个增量备份工具,只针对修改过的文件的修改过的部分进行同步备份,大大缩短了传输的文件的数量和传输时间。rsync
所做的工作为镜像,保证远端服务器与本地文件的统一。如果本地文件没问题,远端也不会有问题。但如果发生误删或因程序运行错误,导致文件出问题,而在同步之前又没有意识到的话,远端的备份也就没了备份的意义,因为它也被损坏了。误删是比较容易发现的,可以及时矫正。但程序运行出问题,则不一定了。具体使用如下 :# 把本地project目录下的东西备份到远程服务器的/backup/project目录下
# 注意第一个project后面的反斜线,表示拷贝目录内的内容,不在目标目录新建project文件夹。注意与第二个命令的比较,两者实现同样的功能。
# -a: archive mode, quals -rlptgoD
# -r: 递归同步
# -p: 同步时保留原文件的权限设置
# -u: 若文件在远端做过更新,则不同步,避免覆盖远端的修改
# -L: 同步符号链接链接的文件,防止在远程服务器出现文件路径等不匹配导致的软连接失效
# -t: 保留修改时间
# -v: 显示更新信息
# -z: 传输过程中压缩文件,对于传输速度慢时适用
rsync -aruLptvz --delete project/ user@remoteServer:/backup/project
rsync -aruLptvz --delete project user@remoteServer:/backup/
rdiff-backup:
不只可以做增量备份,而且会保留每次备份的状态,新备份和上一次备份的差别,可以轻松回到之前的某个版本。唯一的要求就是,本地服务器和远端服务器需要安装统一版本的rdiff-backup
。另外还有2款工具 duplicity
和`Rsnapshot
也可以做类似工作,但方法不一样,占用的磁盘空间也不一样,具体可查看原文链接中的比较。具体的rdiff-backup
安装和使用如下:1.Install rdiff-backup
at both local and remote computers
# 1.Install requirements
#install for ubuntu, debian
sudo apt-get install python-dev librsync-dev
#self compile
#downlaod rsync-dev from https://sourceforge.net/project/showfiles.php?group_id=56125
tar xvzf librsync-0.9.7.tar.gz
export CFLAGS="$CFLAGS -fPIC"
./configure --prefix=/home/user/rsync --with-pic
make
make install
# 2.Install rdiff-backup
#See Reference part for download link
# http://www.nongnu.org/rdiff-backup/
python setup.py install --prefix=/home/user/rdiff-backup
#If you complied rsync-dev yourself, please specify the location of rsync-dev
python setup.py --librsync-dir=/home/user/rsync install -- prefix=/home/user/rdiff-backup
# 3.Add exeutable files and python modules to environmental variables
#Add the following words into .bashrc or .bash_profile or any other config files
export PATH=${PATH}:/home/user/rdiff-backup/bin
export PYTHONPATH=${PYTHONPATH}:/home/user/rdiff-backup/lib/python2.x/site-packages
#pay attention to the x in python2.x of above line which can be 6 or 7 depending on
#the Python version used.
# 4.Test environmental variable when executing commands through ssh
ssh user@host 'echo ${PATH}' #When I run this command in my local computer,
#I found only system environmetal variable is used
#and none of my self-defined environmetal variable is used.
#Then, I modified the following lines in file 'SetConnections.py' in
#/home/user/rdiff-backup/lib/python2.x/site-packages/rdiff_backup
#to set environmental explicitly when login.
#pay attention to the single quote used inside double quote
__cmd_schema = "ssh -C %s 'source ~/.bash_profile; rdiff-backup --server'"
__cmd_schema_no_compress = "ssh %s 'source ~/.bash_profile; rdiff-backup --server'"
#choose the one contains environmental variable for rdiff-backup from .bash_profile and .bashrc.
2.Use rdiff-backup
rdiff-backup --no-compression --print-statistics user@host::/home/user/source_dir destination_dir
destination_dir
exists, please add --force
like rdiff-backup --no-compression --force --print-statistics user@host::/home/user/source_dir destination_dir
. All things in original destination_dir
will be depleted.--exclude '**trash'
or --include /home/user/source_dir/important
.crontab (hit 'crontab -e' in terminal to open crontab)
in the format like 5 22 */1 * * command
which means executing the command
at 22:05 everyday.rdiff-backup -r now destination_dir user@host::/home/user/source_dir.restore
. Add --force
if you want to restore to source_dir
.rdiff-backup -r 10D destination_dir user@host::/home/user/source_dir.restore
. Other acceptable time formats include 5m4s (5 minutes 4 seconds) and 2014-01-01 (January 1st, 2014).rdiff-backup destination_dir/rdiff-backup-data/increments/server_add.2014-02-21T09:22:45+08:00.missing user@host::/home/user/source_dir.restore/server_add
. Increment files are stored in destination_dir/rdiff-backup-data/increments/server_add.2014-02-21T09:22:45+08:00.missing
.
Remove older records to save space
rdiff-backup --remove-older-than 2W --force destination_dir
. Note that an existing file which has not changed for a year will still be preserved. But a file which was deleted 15 days ago can not be restored after this command. Normally one should use --force
since it is used to delete multiple increments at the same time which --remove-older-than
refuses to do by default.rdiff-backup --remove-older-than 20B --force destination_dir
.rdiff-backup --list-increments destination_dir/
.rdiff-backup --list-changed-since 5D destination_dir/
.rdiff-backup --compare user@host::source-dir destination_dir
rdiff-backup --compare-at-time 2W user@host::source-dir destination_dir
.3.A complete script (automatically sync using crontab
)
#!/bin/bash
export PYTHONPATH=${PYTHONPATH}:/soft/rdiff_backup/lib/python2.7/site-packages/
rdiff-backup --no-compression -v5 --exclude '**trash' user@server::source/ bak_dir/
ret=$?
if test $ret -ne 0; then
echo "Wrong in bak" | mutt -s "Wrong in bak" [email protected]
else
echo "Right in bak" | mutt -s "Right in bak" [email protected]
fi
echo "Finish rdiff-backup $0 ---`date`---" >>bak.log 2>&1
echo "`rdiff-backup --exclude '**trash' --compare-at-time 1D user@server::source/ bak_dir/`" | mutt -s "Lists of baked files" [email protected]