控制文件夹递归深度_做深度学习需要知道哪些linux指令?(持续更新)

cf4434db2879243a7e1b3eb99aaa1563.png

系统操作

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

再结合上一个板块“文件操作”中我们讲到的find操作,就能碰撞出更大的火花:

0347523ba7a742e9f751651f967fc57a.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

在sh里,find,ls等命令变成了它的库函数,相关参数也变成了函数的参数,且都按照字符串的形式传入。

上面示例有一个小问题,检测到的文件名字串最后都是带有“n”换行符的,用strip()函数可以去掉:

7e4728016c96cefc0b4c7137f00380d7.png

或者通过列表表达式:

import sh
file_list1 = sh.find('./test', '-type', 'f', '-name', '*.txt')
files_list1 = [f.strip() for f in file_list1]

命令行里的管道操作变成了sh里的嵌套调用:

ac08c14028ac4d35a2022c2f5aacf16c.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
文件描述符:
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

df29620070b7b605b37d98ee40f8e6e5.png

安装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

8c11fcfc6dc1c08710073548fa1a05cd.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
# 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())

Docker(待更新)

MySQL(待更新)

Nginx(待更新)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值