![cf4434db2879243a7e1b3eb99aaa1563.png](https://i-blog.csdnimg.cn/blog_migrate/9c8e4765d37d7a021b2414217ecf1584.jpeg)
系统操作
linux磁盘管理常用的三个命令df、du和fdisk
- df:列出文件系统的整体文件使用量
- du:检查磁盘空间使用量
- fdisk:用于磁盘分区
df -hl #查看磁盘剩余空间
df -h #查看每个根路径的分区大小
du -sh [目录名] #返回该目录的大小
du -sm [文件夹] #返回该文件夹总M数
# 挂载/卸载磁盘
sudo fdisk -l
mount -o rw src_dir dst_dir
umount dir
#即刻关机
sudo shutdown
#定时关机
sudo shutdown -h xx:xx
#重启
sudo reboot
sudo shutdown -r now
sudo init 6
#
ps aux | grep ssh
文件操作
# 文件权限
chmod 777 dir # read,write,executable for all
chmod 777 -R dir # 递归到所有子文件夹
chmod 755 dir # rwx for owner, rx for group
chmod 755 -R dir
# ls文件夹下所有文件
ls dir -hl
# ls文件夹中的前/后N个文件
ls dir | head -N
ls dir | head -n N
ls dir | tail -N
ls dir | tail -n N
# 查找文件
find dir -name "*.xxx"
find dir -name "xxx*"
# 统计文件夹下所有文件个数
ls dir -l | grep "^-" | wc -l # 只统计一层
ls dir -l | grep -c "^-" # 只统计一层
ls dir -lR | gerp "^-" | wc -l # 递归统计所有子文件夹
ls dir -lR | gerp -c "^-" # 递归统计所有子文件夹
find dir -type f | wc -l # 递归统计所有子文件夹
find dir -maxdepth 1 -type f | wc -l # 只统计一层
########## 推荐使用find!!!############
# 统计文件夹下某后缀文件个数
ls dir -l | grep ".xxx" | wc -l #注意不是“*.xxx”
find dir -type f -name "*.xxx" | wc -l
# copy特定后缀文件
find src_dir -type f -name "*.xxx" | xargs -i cp {} dst_dir
find src_dir -type f -name "*.xxx" | xargs cp -t dst_dir
# copy前/后N个特定后缀文件
find src_dir -type f -name "*.xxx" | head -n N | xargs -i cp {} dst_dir
find src_dir -type f -name "*.xxx" | head -N | xargs -i cp {} dst_dir
find src_dir -type f -name "*.xxx" | head -n N | xargs cp -t dst_dir
find src_dir -type f -name "*.xxx" | head -N | xargs cp -t dst_dir
find src_dir -type f -name "*.xxx" | tail -n N | xargs -i cp {} dst_dir
find src_dir -type f -name "*.xxx" | tail -N | xargs -i cp {} dst_dir
find src_dir -type f -name "*.xxx" | tail -n N | xargs cp -t dst_dir
find src_dir -type f -name "*.xxx" | tail -N | xargs cp -t dst_dir
# copy前N个文件,控制一下文件夹搜索的depth
find src_dir -maxdepth 1 -type f | head -N | xargs cp -t dst_dir
find src_dir -maxdepth 1 -type f -name ".xxx"| head -N | xargs cp -t dst_dir
# 随机copy N个文件
find src_dir -type f -name "*.xxx" | shuf -n N | xargs -i cp {} dst_dir
find src_dir -type f -name "*.xxx" | shuf -n N | xargs cp -t dst_dir
# sort and copy the first N files.
find src_dir -type f -name "*.xxx" | sort | head -n N | xargs -i cp {} dst_dir
find src_dir -type f -name "*.xxx" | sort -r | head -n N | xargs cp -t dst_dir
# 从远程服务器往本地服务器copy文件
scp <username>@<ip>:src_dir dst_dir
scp -r <username>@<ip>:src_dir dst_dir # 递归拷贝
# 从本地服务器往远程服务器copy文件
scp src_dir <username>@<ip>:dst_dir
scp -r src_dir <username>@<ip>:dst_dir # 递归拷贝
# 把文件夹下所有文件名字写到一个txt里
find src_dir -type f -name "*.xxx" > dst_dir/xxx.txt
# 把所有文件内容写到一个文件里
cat src_dir/xxx* >> dst_file
find src_dir -type f -name "xxx*" | sort | xargs -i cat {} >> dst_file
# 输出文件的前/后N行
head -n N xxx.xxx
head -N xxx.xxx
tail -n N xxx.xxx
tail -N xxx.xxx
# 计算文件行数
wc -l xxx.xxx
# 计算文件words数
wc -w xxx.xxx
# 输出文件中包含某种pattern的行
grep -n "some_pattern" xxx.xxx
# 输出文件中包含某种pattern的行数
grep -c "some_pattern" xxx.xxx
# 计算文件大小
du -h xxx.xxx
# 计算文件夹大小
du -sh dir
# 文件行打乱
shuf -o src_file dst_file # src_file和dst_file同名时,原地执行操作
# 文件切分
split -l N src_file out_file_prefix # 按行切分,每个文件N行,生成的文件个数 = src_file总行数 / N
split -n N src_file out_file_prefix # 指定切分N个文件,但一行可能会被切分到两个文件中
# 文件批量重命名
for file in "*.xxx"; do mv "$file" "${file/.xxx/_123.xxx}";done # a.xxx -> a_123.xxx
# zip包的压缩和解压
zip -r dst_zip_file src_dir
unzip zip_file
# tar包的压缩和解压
tar -cvf dst.tar src_dir/ # 压缩
tar -xvf tar_file # 解压
#
后台运行指令,保存log
nohup 指令 > xxx.log 2>&1 &
!和sh
做深度学习,我们经常使用的一个强大又非常方便的工具——jupyter notebook,里面有一个非常magic的操作,就是在命令前加入叹号(!),可以直接调用系统命令,例如:
![6df1da09711025f65b41c571be075ecd.png](https://i-blog.csdnimg.cn/blog_migrate/381c8ff2c5c4ec6893053ff8d9c82e9e.png)
再结合上一个板块“文件操作”中我们讲到的find操作,就能碰撞出更大的火花:
![0347523ba7a742e9f751651f967fc57a.png](https://i-blog.csdnimg.cn/blog_migrate/410a1c12ae1fad5683c6b1f2f7bb13b4.png)
试想一个场景,你需要用卷积神经网络做分类任务,首先要做的就是对本地的几万张图片做预处理操作,那么怎样方便快捷地获取它们呢?
image_dir = "/home/abc/image"
imags = !find image_dir -type f -name "*.jpg"
images = list(images)
for i in images:
# do your own operation.
如上,核心就只有一行代码,简便、高效而且功能非常强大。
这里又提出了一个问题,使用!在jupyter notebook里没问题,但是如果我要把代码写在py文件里,那就不行了,好在有强大的替换工具:sh。示例如下:
![daf6e1d1017aac798445cf5e1372f1e9.png](https://i-blog.csdnimg.cn/blog_migrate/dd699a12c198a50a57d909b3aa0b27a7.png)
在sh里,find,ls等命令变成了它的库函数,相关参数也变成了函数的参数,且都按照字符串的形式传入。
上面示例有一个小问题,检测到的文件名字串最后都是带有“n”换行符的,用strip()函数可以去掉:
![7e4728016c96cefc0b4c7137f00380d7.png](https://i-blog.csdnimg.cn/blog_migrate/f17765f5e01340efaab970536001211a.png)
或者通过列表表达式:
import sh
file_list1 = sh.find('./test', '-type', 'f', '-name', '*.txt')
files_list1 = [f.strip() for f in file_list1]
命令行里的管道操作变成了sh里的嵌套调用:
![ac08c14028ac4d35a2022c2f5aacf16c.png](https://i-blog.csdnimg.cn/blog_migrate/c21a71990f69b4cc8733ba5ab61bcf44.png)
linux三剑客——sed
## 通用格式:
sed "some pattern" target_file
# 查找替换——只在屏幕打印输出时替换,不改变原文件
sed "s/xx/oo/g" a.txt # 把a.txt中的xx替换为oo,并打印在屏幕
# 查找替换——在原文件替换
sed -i "s/xx/oo/g" a.txt
# 多处查找替换(原文替换)
sed -i "s/11/22/g;s/33/44/g;s/55/66/g" a.txt #将a.txt中11替换为22,33替换为44,55替换为66
## 总结:"s/xx/oo/g"中的s代表substitute,子串模式匹配,g代表整行。xx是源字符,oo是结果字符。
# 删除空行
sed -i "/^s*$/d" a.txt # d代表删除
# 复制行
sed -n "m,np" a.txt > b.txt # 将a.txt的m到n行复制到b.txt中
文件创建、修改与查看
先理解下重定向 > ,>>,<, <<。
![a1fb8ba344e0ab24f4882a236013cf28.png](https://i-blog.csdnimg.cn/blog_migrate/7b474b4937ddbec700e6048e2cd852bb.jpeg)
文件描述符:
0:标准输入
1:标准输出
2:标准错误输出
# 创建并打开文件(存在时打开,不存在时创建并打开)
## vi和vim可远程ssh使用,gedit不可以。
vi f1.txt
vim f1.txt
gedit f1.txt
# 只创建文件
touch f2.txt
cd > f2.txt
cd >> f2.txt # 同上
# 文件内容查看:cat,tac,more,less,head,tail,nl
cat f3.txt # 从第一行开始显示全部文件内容
tac f3.txt # 从最后一行开始倒着显示全部文件内容
more f3.txt # 一页一页显示文件内容,在more运行中,有几个键可以按:space:向下翻一页;Enter:向下一行;q:离开;b:向上翻页;:f :立即显示文件名和行数; /字串:向下搜索字串;n:重复前一个搜寻
less f3.txt # 一页一页显示文件内容,在less运行中,可以输入的命令:space:向下翻一页;Enter:向下一行;q:离开;b:向上翻页;:f :立即显示文件名和行数, /字串:向下搜索字串;?字串:向上搜索字串。n:同上; N:反向重复前一个搜寻
## 如果是为了搜索字串,推荐less,less支持高亮,more不高亮。
head -n N f3.txt # 显示前N行
tail -n N f3.txt # 显示最后N行
nl f3.txt # 显示全部内容,带行号
# 创建并修改文件:echo, cat
echo "some information" > f4.txt # 把“some information”写入文件f4.txt, 如果文件不存在,则创建;如果文件存在,则覆盖原有内容。
echo "some information" >> f4.txt # 同上,但文件存在时不覆盖,而是在原有文件后面进行追加。
cat > f4.txt # 输入此命令后,进入交互模式,此时从键盘输入的字符会输出到文件f4.txt, 覆盖原有内容。按ctrl + c 结束输入。
cat >> f4.txt # 同上,但是不覆盖原有内容,只是在末尾追加。
# 文件内容合并
cat f5.txt f6.txt > f7.txt
cat f5.txt f6.txt >> f7.txt
#
ls -l > file 2 > /dev/null # 将输出重定向到file,且将错误输出重定向到/dev/null中。 /dev/null:在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。被称作黑洞。
GPU
# 查看gpu使用情况及进程号
sudo nvidia-smi
# 每N秒查看一次gpu使用情况及进程号
watch -n N nvidia-smi
# 查看cuda版本
nvcc -V
# 查看使用gpu的进程
sudo fuser -v /dev/nvidia*
# 关闭gpu进程
sudo kill -9 xxx
# 安装cuda & cudnn
# 安装cuda(https://developer.nvidia.com/cuda-downloads)
Ctrl-Alt+F1
sudo service lightdm stop/start
sudo apt remove --purge nvidia*
sudo apt autoremove
sudo ./cuda_10.0.xxx_xxx.xx_linux.run
# cuda测试
cd /usr/local/cuda-10.0/samples/1_Utilities/deviceQuery
make
./deviceQuery
# 安装cudnn(https://developer.nvidia.com/rdp/cudnn-download)
tar -zxvf cudnn-10.0-linux-x64-v7.4.2.24.tgz
cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
cp cuda/include/* /usr/local/cuda-10.0/include/
# 添加环境变量
gedit ~/.bashrc
## 文本最后添加以下内容:
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda/bin:$PATH
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
## 保存退出,打开新终端激活
source ~/.bashrc
# 参考:https://blog.csdn.net/qq_36999834/article/details/107589779?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
jupyter notebook
远程访问 方法一:
# 配置jupyter notebook可远程访问
jupyter-notebook --generate-config
jupyter-notebook password # 输入密码并确认,这就是以后的登陆密码
vi /home/username/.jupyter/jupyter_notebook_config.json # 复制里面的sha1码
vi /home/username/.jupyter/jupyter_notebook_config.py
# 在jupyter_notebook_config.py 文件填入下面配置:
# 设置默认目录
c.NotebookApp.notebook_dir = u'/home/username/jupyterdata'
# 允许通过任意绑定服务器的ip访问
c.NotebookApp.ip = '*'
# 用于访问的端口
c.NotebookApp.port = 8888
# 不自动打开浏览器
c.NotebookApp.open_browser = False
# 设置登录密码
c.NotebookApp.password = u'sha1:xxxxxxxxxxxxxxxx' # 上面复制的sha1码
# 使用
# 在远程服务器输入:
jupyter notebook
# 打开本地浏览器,输入:
192.168.x.xxx:8888
远程访问 方法二(推荐):
# 配置jupyter notebook可远程访问
jupyter-notebook --generate-config
jupyter-notebook password # 输入密码并确认,这就是以后的登陆密码
# 使用
jupyter notebook --ip 0.0.0.0
conda虚拟环境相关操作:
# 查看conda环境
conda info -e # 查看所有安装的conda环境
conda info # 查看当前环境的信息
conda list # 查看当前环境安装了哪些包
# 创建conda环境
conda create -n env_name #创建conda环境
conda create -n env_name python=3.5.2 #创建基于python3.5.2的conda环境,并且安装依赖包。
# 切换conda环境
conda activate env_name #切换到新环境
conda activate root #切换到root环境
conda deactivate #退出当前环境
# 删除conda环境
conda remove -n env_name --all
# 清理pkgs下的安装包,节省磁盘空间
conda clean -a
# 查看python版本
import sys
print(sys.version)
# 一个例子
conda create -n tensorflow python=3.5.2
conda activate tensorflow
#Tensorflow based on GPU
pip install sh
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.1.0-cp35-cp35m-win_amd64.whl
pip install tensorflow==2.0.0-alpha0 #同上一行
conda install opencv=3.4.2
pip install opencv-python
conda install scipy #在当前环境下安装scipy,keras需要
conda install jupyter #
conda install pandas #
conda install scikit-learn
pip install scikit-learn
pip install scikit-image
pip install lightgbm
pip install xgboost
pip install catboost
conda install seaborn
pip install keras
jupyter notebook
# 安装pytorch
#默认 使用 cuda10.1
pip install torch===1.3.0 torchvision===0.4.1 -f https://download.pytorch.org/whl/torch_stable.
#cuda 9.2
pip install torch==1.3.0+cu92 torchvision==0.4.1+cu92 -f https://download.pytorch.org/whl/torch_stable.html
# cpu
pip install torch==1.3.0+cpu torchvision==0.4.1+cpu -f https://download.pytorch.org/whl/torch_stable.html
相关库的安装:
- openslide
pip install openslide-python==1.1.2
sudo apt install python-openslide
在jupyter notebook中进行虚拟环境切换:
# 1. 安装nb_conda
conda install nb_conda
# 2. 启动虚拟环境,假设名字为test
conda activate test
# 3. 在虚拟环境中安装ipykernel模块(nb_conda有时候会工作异常。一个方法是通过ipykernel来注册)
pip install ipykernel
# 4.(可选)将环境添加到kernel中
python -m ipykernel install --user --name test --display-name test
## 上述命令将把通过conda create创建的名为test的虚拟环境注册到notebook当中,并且其显示名也为test
# 5. 重启jupyter notebook,效果如下图所示
jupyter notebook --ip 0.0.0.0
![01c2f8f57a78bd128c35c92b57b37e6c.png](https://i-blog.csdnimg.cn/blog_migrate/ef7bb67242cc1771bab1051c62f8860f.png)
![df29620070b7b605b37d98ee40f8e6e5.png](https://i-blog.csdnimg.cn/blog_migrate/3f96be864327fde4b24ecf583600b240.jpeg)
安装cpp kernel:
conda create -n cpp
conda activate cpp
conda install xeus-cling -c conda-forge
pip install ipykernel
python -m ipykernel install --user --name cpp --display-name cpp
# 重启jupyter notebook
jupyter notebook --ip 0.0.0.0
# 效果如下图所示
![7c01e6a1bbe7a78ccbfd8f5e9ba6fca4.png](https://i-blog.csdnimg.cn/blog_migrate/4f6e13314db0c5044203f359569efe91.jpeg)
![8c11fcfc6dc1c08710073548fa1a05cd.png](https://i-blog.csdnimg.cn/blog_migrate/5b4273a4b0f6d39b1c72278917859097.png)
这样,就可以在jupyter notebook里写c++的代码,飞起!
SSH
sudo apt update
sudo apt install openssh-server
用户环境变量与系统环境变量
# 修改用户环境变量
vim ~/.bashrc
export PATH=xxx:$PATH
更新:
source ~/.bashrc
# 修改系统环境变量
sudo vim /etc/profile
export PATH=xxx:$PATH
更新:
source /etc/bashrc
设置完后,退出root再重进,root的环境变量又还原了,仍没有改变
解决办法:
上面设置完成后,再执行下述操作:
vim /root/.bashrc , 在文末添加一句话:
source /etc/profile
然后更新:
source /root/.bashrc
pip使用国内源
# 使用默认源
pip install xxx
# 使用清华源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xxx
# 使用阿里源
pip install -i http://mirrors.aliyun.com/pypi/simple/ xxx
# 或者配置默认源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装samba
#step1:
sudo apt install samba
sudo apt install smbclient
#step2:
sudo vim /etc/samba/smb.conf
# 在smb.conf文件的行尾添加:
[xxx] # xxx为samba的共享文件夹
comment = Share Folder require password
browseable = yes
path = /home/xxx
create mask = 0777
directory mask = 0777
valid users = xxx
public = yes
writable = yes
available = yes
:wq
#step3:
sudo /etc/init.d/samba restart
#step4:
cd /home
sudo mkdir xxx
sudo chmod 777 xxx
#step5:
# 添加账户
sudo groupadd xxx -g 6000
sudo useradd xxx -g 6000 -d /home/xxx
sudo passwd xxx
sudo usermod -aG users xxx
sudo smbpasswd -a xxx
#step6:
# 转到windows电脑,添加一个网络位置
ip_addressxxx # ip_address为创建samba的ubuntu电脑的本地ip
清理空间
# 查看apt缓存
sudo du -sh /var/cache/apt
# 清理apt缓存
sudo apt clean
# 查看缩略图缓存
du -sh ~/.cache/thumbnails
#清理缩略图缓存
rm -rf ~/.cache/thumbnails/*
错误处理
(1) The package *** needs to be reinstalled, but I can't find an archive for it.
$ sudo dpkg --remove --force-all ***
$ sudo apt-get update
Git
![435c20c77b931c7759de75e938872917.png](https://i-blog.csdnimg.cn/blog_migrate/19456641c64c14d08c9050a9dd74f830.jpeg)
# 1. 安装完git以后,第一步:
git config --global user.name "xxx"
git config --global user.email "xxx @xxx.com "
# 2. 创建版本库Repository(本地仓库)
mkdir abc
cd abc
git init #执行后在文件夹abc下面会生成.git文件夹,说明成功
# 3. 版本库操作
# 1) 添加文件进暂存区
git add readme.txt # 把文件readme.txt添加进暂存区
git add . # 把所有已改动文件添加进暂存区.
# 2) 从暂存区提交到版本库
git commit -m "some information"
# 3) 查看当前状态:
# Changes not staged for commit: 有文件修改未提交暂存区;
# Changes to be committed: 已经提交暂存区,但未提交版本库;
# nothing to commit, working directory clean: 无需提交,工作区干净.
git status
# 4) 查看历史记录信息
git log # 显示当前版本及当前版本之前的记录信息.
git log --pretty=oneline # 只显示一行
git reflog # 显示所有历史信息, 包含回退版本信息.
# 5) 版本回退
git reset --hard=HEAD^ # 回退一个版本
git reset --hard=HEAD^^ # 回退两个版本
git reset --hard=HEAD~N # 回退N个版本
## 如果文件未add到暂存区
git checkout -- xxx.xxx #如果文件xxx.xxx未add到暂存区,checkout上一个版本替换当前更改
git checkout -- . # checkout所有未add到暂存区的文件,用上一个版本替换当前更改
# 6) 删除版本库里的文件
# 注意,删除文件跟增加文件一样,也需要先add(注意add后面的.),再commit.
rm test.txt
git add .
git commit -m "delete test.txt"
# 4. 连接远程仓库
## 由于本地git库和远程github仓库之间的传输通过ssh加密,所以需要一点设置:
# 1)创建SSH key.
## 看看本地是否有.ssh文件夹,有的话,里面是否有id_rsa和id_rsa.pub这两个文件,有的话跳过,没有的话输入如下:
ssh-keygen -t rsa –C “youremail@xxx.com”
# 2) 登陆github -> Settings -> SSH and GPG keys -> New SSH key,
# 在 title部分起个名字,Key部分把id_rsa.pub的内容粘贴进去.点击add key, 完成.
# 3) 添加远程库
## 点击"+" -> new repository -> 在Repository name * 中添加仓库的名字. -> 点击 Create repository
## 把本地仓库和刚创建的远程仓库关联:
git remote add origin https://github.com/your_github_name/your_repository_name.git
git push -u origin master # 本地仓库分支master推送到远程仓库. 第一次需要加 -u 参数,以后都不需要加-u参数.
# 5. 从远程仓库克隆
git clone https://github.com/xxx/xxx.git
# 6. 创建于合并分支
# 1) 创建并切换dev分支
git checkout -b dev
# 2) 创建分支 dev
git branch dev
# 3) 切换分支dev
git checkout dev # 1) = 2) + 3)
# 4) 查看所有分支
git branch # 带星号*为当前所在分支
# 5) 合并分支
git merge dev
# 6) 删除分支
git branch -d dev
Eclipse快捷键
ctrl + alt + up/down: 复制选中的代码块,并粘贴选中代码块的上面/下面
alt + / : 补全 # ma , sysout.
Pytorch
#
import torch
import torch.nn as nn
import torchvision
# pytorch, cuda, cudnn 版本信息
print(torch.__version__)
print(torch.version.cuda)
print(torch.backends.cudnn.version())
# gpu type, count, capability, available or not.
print(torch.cuda.get_device_name(0))
print(torch.cuda.device_count())
print(torch.cuda.get_device_capability(0))
print(torch.cuda.is_available())