0%

tar 压缩以及解压

1
2
3
tar -czvf test.tar.gz a.txt   //压缩 a.c文件为test.tar.gz
tar -xzvf test.tar.gz // 解压
tar -tzvf test.tar.gz //列出压缩文件的内容

linux中环境变量

参考https://www.cjavapy.com/article/2250/

1、介绍

Linux中环境变量包括系统级和用户级

1)系统级

/etc/environment:系统在登录时读取的第一个文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命令,而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE,因此文件中如果要定义PATH环境变量,只需加入类似如PATH=$PATH:/xxx/bin的代码即可。

/etc/profile:是系统登录时执行的第二个文件,可以用于设定针对全系统所有用户的环境变量。该文件一般是调用/etc/bash.bashrc文件。

/etc/bash.bashrc:系统级的bashrc文件,为每一个运行bash shell的用户执行此文件。此文件会在用户每次打开shell时执行一次。

注意/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。 这两个文件修改后一般都要重启系统才能生效。

2)用户级

~/.profile: 是对应当前登录用户的profile文件,用于定制当前用户的个人工作环境。

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,会设置一些环境变量,执行用户的.bashrc文件。

~/.bashrc: 是对应当前登录用户的bash初始化文件,当用户每次打开shell时,系统都会执行此文件一次。通常设置环境变量修改这个文件。

上述配置文件执行先后顺序如下:

1
/etc/enviroment `–> `/etc/profile` –> `~/.profile` –> `/etc/bash.bashrc `–> `~/.bashrc

2、环境变量的作用

环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。比如PATH,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找;再如tc或vc++中,set include=path1;path2; 是告诉编译程序到哪里去找.h类型的文件;当然不仅仅是指定什么路径,还有其它的作用的,如set dircmd=/4 设置一个环境变量的作用是在使用dir命令时会把/4作为缺省的参数添加到你的dir命令之后,就像你的每个命令都加了/4参数,它实际上是给命令解释程序command设置的一个环境变量,并且是给dir这个内部命令。

3、配置环境变量的方法

1)临时环境变量

linux下设定环境变量时,如果只是临时用一下,可以直接在shell下用setexport命令设定环境变量。但是只能在当前shell环境下可以用,切换或关闭重新进入就会失效。具体配置方法,如下,

1
2
3
4
5
#终端输入:
export MYSQLPATH=/home/mysql #MYSQLPATH设置为该路径
#终端查看一个特定环境变量包含的内容,比如,MYSQLPATH,PATH
echo $PATH
echo $MYSQLPATH

2)永久环境变量

设置的环境变量,需要经常使用的,而不是临时使用,把上面的设置环境变量命令写到上面提到的相应配置文件中即可,则可以每次开机或打开shell时自动设置,

例如,

只需要当前用户生效的环境变量:

终端中输入:sudo vi ~/.bashrc,编辑这个文件,在其末尾添加:

1
2
3
export MYSQLPATH=/home/mysql:$MYSQLPATH
# path采用:来分隔,冒号左右不需要空格.
# :$MYSQLPATH在后面新添加的优先搜索,$MYSQLPATH:在前面说明新添加的最后搜索,不加代表新路径设置为MYSQLPATH路径。

注意:在终端执行,source ~/.bashrc ,使其立即生效,或者重启电脑即可。

设置所有用户生效的环境变更:

终端中输入:sudo vi /etc/profile,编辑这个文件,在其末尾添加:

1
2
3
export MYSQLPATH=/home/mysql:$MYSQLPATH
# path采用:来分隔,冒号左右不需要空格.
# :$MYSQLPATH在后面新添加的优先搜索,$MYSQLPATH:在前面说明新添加的最后搜索,不加代表新路径设置为MYSQLPATH路径。

注意:在终端执行,source /etc/profile ,使其立即生效,或者重启电脑即可。

查看linux版本信息

https://blog.csdn.net/lu_embedded/article/details/44350445

查看进程

https://blog.csdn.net/lechengyuyuan/article/details/16337233

1
2
3
4
ps -ef # 查看所有本机进程
ps -ef |grep python # 查看python进程

kill -9 pid # 杀死某个进程

https://blog.csdn.net/li528405176/article/details/83379164

将程序留在后台运行

1
nohup python -u test.py > out.log 2>&1 &

参考 https://www.jianshu.com/p/4041c4e6e1b0

github官网给出的教程挺通俗易懂的,移步[https://docs.github.com/cn/get-started/using-git]

本地配置ssh和github,参考官方文档[https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/about-ssh]

远程仓库使用

在本地设置推送到远程仓库的用户名:[https://docs.github.com/cn/get-started/getting-started-with-git/setting-your-username-in-git]

1
git config --global user.name "your name"

远程URL是 Git 一种指示“您的代码存储位置”的绝佳方式,您只能推送到两类 URL 地址:

  • HTTPS URL,如 https://github.com/user/repo.git
  • SSH URL,如 git@github.com:user/repo.git

Git 将远程 URL 与名称相关联,您的默认远程通常名为 origin

创建远程仓库,并将其命名为master

1
git remote add master <REMOTE_URL> 

如果后面想更改url,使用

1
git remote set-url origin <new_url>

查看远程仓库设置:

1
git remote -v

重命名远程仓库

1
git remote rename origin destination

删除远程仓库

1
git remote rm destination

推送提交至远程仓库,

1
git push <REMOTENAME> <LOCALBRANCHNAME>:<REMOTEBRANCHNAME> 

拉取某远程仓库距离上一次抓取之后的工作:

1
2
git fetch <remote_name>
必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

显示某远程仓库的信息

1
git remote show <remote_name>

忽略文件

见文档

1
touch .gitignore #该命令在项目根目录会创建一个.gitignore文件,然后往该文件中填东西

如果有些我们不需要跟踪的文件已经提交到了暂存区,那么使用下面的命令来删除暂存区的该文件,再将该文件写入.gitignore文件

1
2
git rm --cached FILENAME 该命令直接将暂存区的那个版本删除了
或者 git restore --staged <file> 该命令会用暂存区的代码覆盖掉工作区的代码

在自己的project中添加别人的project

https://devconnected.com/how-to-add-and-update-git-submodules/

1
2
3
4
5
6
7
git submodule add <remote_url> <destination_folder>

git commit -m "Added the submodule to the project."

git push

git submodule update --init --recursive # 如果想要拉取别人仓库里的submodule到本地

分支

创建分支:当执行git init时,默认创建名字是master的分支

1
git branch <branch_name>

切换到某分支:

1
git checkout <branch_name>

分支切换会改变你工作目录中的文件。在切换分支时,一定要注意你工作目录里的文件会被改变。 如果是切换到一个较旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。 如果 Git 不能干净利落地完成这个任务,它将禁止切换分支。

上面两条命令可以使用一条命令搞定:

1
git checkout -b <branch_name>

在一条分支上,比如hotfix修改一些文件提交后,需要回到master分支并将hotfix上的分支的修改合并到master

1
git merge hotfix

这是一个Fast-forward。合并完之后master会和hotfix指向同一个位置,这时可以删除hotfix这个分支:git branch -d hotfix

1
2
3
4
5
6
7
8
9
10
11
os.makedirs(path[, mode]) 
递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
输出在文件夹中的文件名通过在树中游走,向上或者向下。返回的是一个三元组(root,dirs,files),是一个生成器类型,需要用for遍历读取

os.chdir(path)
改变当前工作目录

os.listdir(path)
返回path指定的文件夹包含的文件或文件夹的名字的列表。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
import os
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))

path = "/var/www/html/"
dirs = os.listdir( path )
# 输出所有文件和文件夹
for file in dirs:
print (file)

os.walkos.listdir两个函数的区别在于前者会遍历到子文件夹中的子文件,而后者只是返回你传入的path中的文件夹名字和文件名字。

os库中有一个path的模块,专门用于处理文件path相关的属性信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
os.path.abspath(path)
返回绝对路径

os.path.basename(path)
返回文件名

os.path.exists(path)
如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。

os.path.join(path1[, path2[, ...]])
把目录和文件名合成一个路径

os.path.split(path)
把路径分割成 dirname 和 basename,返回一个元组

os.path.splitext(path)
分割路径,返回路径名和文件扩展名的元组

os.path.walk(path, visit, arg)
遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数

例子:

1
2
3
4
5
6
7
import os

print( os.path.basename('/root/runoob.txt') ) # 返回文件名
print( os.path.dirname('/root/runoob.txt') ) # 返回目录路径
print( os.path.split('/root/runoob.txt') ) # 分割文件名与路径
print( os.path.join('root','test','runoob.txt') ) # 将目录和文件名合成一个路径
print( os.path.splitext('/root/runoob.txt') )
1
2
3
4
5
runoob.txt
/root
('/root', 'runoob.txt')
root/test/runoob.txt
('/root/run/test', '.txt')

上面的split和splitext,前者分割出了文件名和路径,而后者可以分割出路径名和扩展名,如果想要获得文件的扩展名,可以用splitext,传入文件的path就可以了。

1
os.mknod(filename) 创建

复制文件和删除文件,移动文件

如果是删除一个目录,可以使用以下两种方式:

1
2
3
4
5
6
7
8
9
import shutil
# method 1
if os.path.exists(root_dir):
shutil.rmtree(root_dir) # 这里不可以使用os.removedirs(),removedirs只可以删除非空的文件夹,rmdir也是

# method 2
if len(os.listdir(root_dir)) > 0:
for file in os.scandir(root_dir):
os.remove(file.path)

如果想复制一个文件到另外一个文件夹,参考 https://zhuanlan.zhihu.com/p/35725217

1
copyfile(source_file, destination_file)

记住这里第二个参数一定要是可写入的文件名字,而不是目录。

移动文件

1
2
3
4
5
6
7
8
9
10
import shutil
import os

file_source = 'Path/Of/Directory'
file_destination = 'Path/Of/Directory'

get_files = os.listdir(file_source)

for g in get_files:
shutil.move(file_source + g, file_destination)

读写csv文件

第一个方式是用pandas,具体不介绍。

这里总结一下csv库

1
2
3
4
5
6
7
8
9
10
# 读取csv文件
with open(filename,'r') as csvfile:
csv_reader = csv.reader(csvfile)
for row in csv_reader:
print(row[1]) # 用列表的index取值
# 写csv文件
with open(filename,'w') as csvfile:
csv_writer = csv.writer(csvfile)
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) # writerow接受一个list,所有值都会写在一行里
spamwriter.writerows([[],[],[]]) # writerows写入多行,每一行是一个列表,传进去的是列表的列表

除了写入list,还可以写字典类型的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# my data rows as dictionary objects 
mydict =[{'branch': 'COE', 'cgpa': '9.0', 'name': 'Nikhil', 'year': '2'},
{'branch': 'COE', 'cgpa': '9.1', 'name': 'Sanchit', 'year': '2'},
{'branch': 'IT', 'cgpa': '9.3', 'name': 'Aditya', 'year': '2'},
{'branch': 'SE', 'cgpa': '9.5', 'name': 'Sagar', 'year': '1'},
{'branch': 'MCE', 'cgpa': '7.8', 'name': 'Prateek', 'year': '3'},
{'branch': 'EP', 'cgpa': '9.1', 'name': 'Sahil', 'year': '2'}]

# field names
fields = ['name', 'branch', 'year', 'cgpa']

# name of csv file
filename = "university_records.csv"

# writing to csv file
with open(filename, 'w') as csvfile:
# creating a csv dict writer object
writer = csv.DictWriter(csvfile, fieldnames = fields)

# writing headers (field names)
writer.writeheader()

# writing data rows
writer.writerows(mydict)