跳转至

Linux

给你的linux创建一个回收站

给你的linux创建一个垃圾篓/回收站,防误删

创建一个垃圾回收站,保存被删除距今3天的文件,过期则被删除

1. 在你的主目录下,创建文件夹 .trash

Bash
1
2
cd ~
mkdir .trash

2. 在你的常用脚本目录下创建这俩脚本

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
TRASH_DIR="/home/lixy/.trash"

for i in $*; do
    STAMP=`date +%s`
    fileName=`basename $i`
    if [[ -d $TRASH_DIR/$fileName.$STAMP  ]];then
        mkdir $TRASH_DIR/$fileName.$STAMP
    fi
    mv $i $TRASH_DIR/$fileName.$STAMP
done
Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
##################################################
# File Name   : /home/lixy/bin/removeRF.sh
# Author      : biolxy
# E-mail      : biolxy@aliyun.com
# Created Time: Wed 17 Apr 2019 02:48:47 PM CST
##################################################
#!/bin/bash
# 该文件夹下文件名字格式为    : JZ201810081226.1555481687
# 文件夹即为你设置的垃圾箱地  : /home/lixy/.trash
inputdir=`realpath $1`
STAMP=`date +%s`
cd ${inputdir}
for i in `ls -a $inputdir `
do
    fileRemoveTime=${i##*.} # 表示从左边开始删除最后(最右边)一个 . 号及左边的所有字符
    #if [ $fileRemoveTime ]  # 检测字符串是否为空,不为空返回 true。
    # ${#fileRemoveTime} 返回字符串长度,也是一个str
    if [ ${#fileRemoveTime} = 10 ] # = 检测两个字符串是否相等,相等返回 true; 检测字符串长度是否等于10,等于则返回 true。
    then
        # echo $STAMP $fileRemoveTime
        # echo ${#fileRemoveTime}
        difference=$[ $STAMP - $fileRemoveTime ]  # 支持的运算符与let相同,但也只支持整数运算
        # echo $difference
        # 24 * 60 * 60 * 3 = 259200 s   即 3 天
        if [ $difference -gt 259200 ];then
            echo "# `date` : rm file $i"
            /usr/bin/rm -rf $i
        fi
    fi
done

3. 用 remove.sh 替换 rm

Bash
1
2
3
4
vim ~/.bashrc   # 你用的是zsh的话就改为 ~/.zshrc
chmod +x /home/lixy/bin/remove.sh   # 给remove.sh 添加可执行权限
alias rm='/home/lixy/bin/remove.sh'    # 替换rm, 保存退出
source ~/.bashrc  # 刷新环境变量
替换过之后,rm 删除的文件,会被移动到 /home/lixy/.trash 文件夹,并且会在文件后添加 .1555481687的后缀,该后缀为删除时的时间(秒)

4. 添加定时任务

Bash
1
30 6 * * * /bin/bash /home/lixy/bin/removeRF.sh /home/lixy/.trash  > /home/lixy/.trash/remove.log
每天早上6.30 调用脚本,删除指定的.trash 文件夹下的文件,脚本中会根据文件移动到.trash 时添加的后缀,判断移动时间,移动时间大于3天的,即被 /usr/bin/rm 强制删除

编程类开放书籍荟萃[转]

说明

原文地址在 这里,因为有的内容我不需要,所以只把对我有用留下,放在github是为了方便我自己查找。

操作系统

C/C++

计算机科学的基础

Python

Shell

AWK

R

Perl

编程艺术

web服务器

版本控制

NoSQL

MySQL

项目相关

生物信息学

书单

精品视频推荐

分类 课程名称 作者 来源 备注
C语言 程序设计入门 翁恺 MOOC https://yam.gift/2018/06/20/C/2018-06-20-C-Weng-ZhejiangUniversity/
C++ 面向对象程序设计_C++ 翁恺 MOOC https://github.com/Libaier/ABC/tree/master/c%2B%2B
操作系统 操作系统原理 向勇、陈渝 实验楼、MOOC、学堂在线 - 配套上机实验地址: https://www.shiyanlou.com/courses/221 github上的课程项目: https://github.com/chyyuu/os_course_info
C++ C++面向对象高级开发 Part1&2 侯捷 GeekBand、Boolan https://github.com/FangYang970206/Cpp-Notes
Java 面向对象程序设计 翁恺 MOOC https://www.icourse163.org/course/ZJU-1001542001 https://github.com/pageYe123/JavaMOOC_icourse
数据结构(C++) 数据结构(上&下) 邓俊辉 MOOC https://github.com/HuyuYasumi/DSA_CPP_Deng https://www.xuetangx.com/courses/course-v1:TsinghuaX+30240184+sp/about

github 优质资源

  1. freeCodeCamp/freeCodeCamp 免费代码训练营
  2. EbookFoundation/free-programming-book 免费编程图书
  3. CyC2018/CS-Notes 国人编写的计算机基础教程,中文
  4. jwasham/coding-interview-university 面试考点总结
  5. vinta/awesome-python Python 的一些优质资源. 前面提到的 awesome 系列列表,不再赘述
  6. github/gitignore GitHub 提供的各种项目的 gitignore 文件模板,省了自己写了

Linux安装rar解压软件

系统环境

centOS7

Bash
1
2
3
4
5
[root@dbf69ae824f9 TCR]# uname -m&&uname -r
x86_64
3.10.0-514.21.1.el7.x86_64
[root@dbf69ae824f9 TCR]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

下载软件包

Bash
1
2
3
4
5
wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz
tar zxvf rarlinux-3.8.0.tar.gz
cd rar
make
make install 

注意:安装需要root权限,没有的话建议用docker尝试,或者自己修改makefile里面的PREFIX 路径

遭遇bug

在尝试解压文件时:

Bash
1
rar x example.rar 

遇到报错:

Bash
1
bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

解决

解释:是因为64位系统中安装了32位程序

解决方法:

Bash
1
yum install glibc.i686

再次尝试解压文件,又遇到报错:

Bash
1
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

解决办法:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[root@dbf69ae824f9 rar]# yum whatprovides libstdc++.so.6
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.163.com
 * updates: mirrors.163.com
libstdc++-4.8.5-36.el7.i686 : GNU Standard C++ Library
Repo        : base
Matched from:
Provides    : libstdc++.so.6



libstdc++-4.8.5-36.el7.i686 : GNU Standard C++ Library
Repo        : @base
Matched from:
Provides    : libstdc++.so.6



[root@dbf69ae824f9 rar]#

yum whatprovides libstdc++.so.6该命令会提示哪个安装包有这个库文件如上,libstdc++-4.8.5-36.el7.i686 这个包可以提供 libstdc++.so.6库,执行

Bash
1
yum install libstdc++-4.8.5-36.el7.i686

然后,rar 就可以用了

rar -h 查看使用帮助。

参考

  • https://haiwei2009.iteye.com/blog/1908263
  • http://blog.51cto.com/oldboy/597515

Git develop SOAP

我的流程

1. 要从Github下载一个项目,需要用到clone命令。

Bash
1
git clone xxxxxxx.git

2. 创建并切换到新建的分支

Bash
1
git checkout -b feature-A develop

然后可以在新的分支上愉快的写代码开发新功能了,开发测试完毕后:

3. 用add命令来添加新写的代码,commit命令用来提交新写的代码

Bash
1
2
git add feature-A
git commit -m "add feature A"

4. add命令执行后,修改被保存到暂存区。可以理解为你操作本地文件按了下ctrl + s

接下来,不可以直接用到merge命令,合并feature-A分到develop去,如果这样做,很可能出现冲突。因为可能出现有很多人在develop分支上更新。所以你这个时候用pull命令,把远程仓库的更新取回并更新。

shell git checkout develop git pull origin develop

5. 然后再切换回自己的分支,用rebase命令合并新更新到自己目前工作的分支。

Bash
1
2
git checkout feature-A
git rebase develop

一般情况下rebase都是会有冲突的,详细查看冲突可以用命令git status然后就会显示哪个文件有冲突,然后打开有冲突的哪个文件,会发现有一些“<<<<<<<”, “=======”, “>>>>>>>” 这样的符号。

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
"<<<<<<<" 表示冲突代码开始

"=======" 表示test与分支冲突代码分隔符

">>>>>>>" 表示冲突代码的结束

<<<<<<<  

所以这一块区域test分支的代码

=======  
这一块区域develop分支的代码

>>>>>>> 

rebase 和 merge的另一个区别是rebase 的冲突是一个一个解决,如果有十个冲突,先解决第一个,然后用命令

shell git add -u git rebase --continue

继续后才会出现第二个冲突,直到所有冲突解决完,而merge 是所有的冲突都会显示出来。

所以rebase的工作流就是

Bash
1
2
3
4
5
6
7
8
9
git rebase 
while(存在冲突) {
    git status
    找到当前冲突文件,编辑解决冲突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

最后冲突全部解决,rebase成功!!

6. 合并分支git merge --no-ff feature-A 到develop

Bash
1
2
3
git checkout develop
git pull
git merge --no-ff feature-A

7. 更新到gitlab

Bash
1
git push origin develop

引用部分

项目中长期存在的两个分支

  • master:主分支,负责记录上线版本的迭代,该分支代码与线上代码是完全一致的。
  • develop:开发分支,该分支记录相对稳定的版本,所有的feature分支和bugfix分支都从该分支创建。

其它分支为短期分支,其完成功能开发之后需要删除

  • feature/*:特性(功能)分支,用于开发新的功能,不同的功能创建不同的功能分支,功能分支开发完成并自测通过之后,需要合并到 develop 分支,之后删除该分支。
  • bugfix/*:bug修复分支,用于修复不紧急的bug,普通bug均需要创建bugfix分支开发,开发完成自测没问题后合并到 develop 分支后,删除该分支。
  • release/*:发布分支,用于代码上线准备,该分支从**develop**分支创建,创建之后由测试同学发布到测试环境进行测试,测试过程中发现bug需要开发人员在该release分支上进行bug修复,所有bug修复完后,在上线之前,需要合并该release分支到**master**分支和**develop**分支。
  • hotfix/*:紧急bug修复分支,该分支只有在紧急情况下使用,从**master**分支创建,用于紧急修复线上bug,修复完成后,需要合并该分支到**master**分支以便上线,同时需要再合并到**develop**分支。

参考

  • https://segmentfault.com/a/1190000008209343
  • http://www.open-open.com/lib/view/open1451353135339.html
  • http://www.open-open.com/lib/view/open1461324562769.html
  • https://blog.csdn.net/chenansic/article/details/44122107

将cd和ls两个命令组合起来使用

1、 将 cd 和 ls 两个命令组合起来使用

效果:很明显,可以少敲一次命令

1.1、 具体实现

编辑 .bashrc文件(如果你用的时zsh或者时csh 就去编辑其对应的配置文件,如~/.zshrc~/.cshrc

在文件中添加如下的一个函数cl

Bash
1
2
3
4
5
cl() {
    cd "$@" && ls
}

alias 'cd'=' cl'

保存退出,刷新

Bash
1
2
3
source ~/.bashrc 
source ~/.zshrc
source ~/.cshrc

在终端里敲 cl /home 查看效果

该命令是 cd 和 ls 的组合命令,若cd命令执行失败,则 ls 命令不会执行

你用的是哪个版本的rename

1、 mv 与 rename 的区别

“mv命令只能对单个文件重命名”,这实就是mv命令和rename命令的在重命名方面的根本区别。

当你的目录下由大量的文件需要批量命名时,rename的作用就体现出来了,例如100个后最为.html 的文件替换为 .txt 文件,通常你需要写一行for循环,如

Bash
1
$ for i in `ls *.html`;do name=`basename .html`; mv $i $name.txt ;done

如果你想替换的字符不再文件的最前或最后方,由或则你想实现更多功能,那么你就需要rename

2、 rename 有两个版本

Linux 的rename命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了,由于历史原因,在Perl语言大红大紫的时候,Linux的工具开发者们信仰Perl能取代C,所以大部分工具原来是C版本的都被Perl改写了,因为Perl版本的支持正则处理,所以功能更加强大,已经不再需要C语言版本的了。

3、 如何区分系统里的rename命令是哪个版本的?

我在网上搜到描述都是这个

输入man rename 看到第一行是 RENAME(1) Linux Programmer’s Manual RENAME(1) 那么 这个就是C语言版本的。 而如果出现的是: RENAME(1) Perl Programmers Reference Guide RENAME(1) 这个就是Perl版本的了!

然而这根本就**不对!**

我的 centOS下是c版rename :

mark

RENAME(1) User Commands RENAME(1)

并不是 RENAME(1) Linux Programmer’s Manual RENAME(1)

我的ubuntu下是perl版的rename:

mark

RENAME(1p) User Contributed Perl Documentation RENAME(1p)

并不是RENAME(1) Perl Programmers Reference Guide RENAME(1)

正确的做法:

Bash
1
vim `which rename`

c语言版本的是一个二进制文件,打开后是乱码

perl语言的你会明显看到 #!/usr/bin/perl -w

亦或者你可以通过上述图片中rename的用法来判断你用的是哪个版本

4、 两个版本的语法差异:

C语言的rename的语法格式是:

Bash
1
rename .html .txt  *.html

C语言的rename的语法格式是:

Bash
1
rename 's/\.html$/\.txt/' *.html
  • rename C语言版本所能实现的功能:批量修改文件名,结果是每个文件会被用相同的一个字符串替换掉!也就是说,无法实现诸如循环 然后按编号重命名!
  • 重点: C语言版本的rename无法处理带有- 的替换(别问怎么知道,都是泪啊)

5、 Perl 版本的批量重命名

Perl 版本的好处是,你可以使用正则表达式来完成很奇特的功能。

具体用法就不细说了。

6、 如果你的服务器不幸安装的时C版的rename,怎么办?安装一个rename

Text Only
1
conda install rename