命令行指令
Linux要查看所有和pdf相关的命令 可以输入pdf 再按Tab键
目录
ls -l
看当前目录下文件的基本属性ls -a
看隐藏文件ls|wc -l
查看当前目录下文件+文件夹数ls -l|grep ^d|wc -l
显示当前目录文件夹数ls -l|grep ^-|wc -l
显示当前目录文件数ls|gawk -F. '{print $2}'|sort -u
得到后缀类型(空白是目录)
压缩
- bz2文件解压缩:压缩:
bzip2 file
解压:bzip2 -dk file.bz2
。-d表示解压,-k表示不删除源文件 - rar文件解压缩:压缩目录:
rar a test ./script/
,查看压缩包文件内容是:rar l test.rar
,解压:unrar e test.rar ./script/
- tar文件:压缩目录:
tar -cvf test.tar ./test
,解压:tar -xvf test.tar
- zip:压缩目录:
zip -r test.zip ./test
,解压:unzip test.zip
- 查看zip文件:
unzip -l files.zip | less
或者vim files.zip
- fuse-zip 可以实现zip文件的挂载,niubility!
文件操作
- 服务器文件拷贝到本地:
scp xzhou@172.16.46.88:/home/xzhou/Downloads/test.rar ./Downloads/test.rar
- 本地文件拷贝到docker容器:
docker cp ./testwine.zip 容器ID:/home/xzhou/Downloads
- 查找文件:
find * test.rar
- 删除文件夹
rm -rf test
- tree可以看到目录树结构
sshfs xzhou@172.16.46.88:/home/xzhou/project 88_mount/
将远程服务器88的文件夹/home/xzhou/project挂载到本机的88_mount/
目录下,管理员需要sshfs xzhou@172.16.46.88:/home/xzhou/project 88_mount/ -o allow_other
,取消挂载fusermount -u 88_mount/
fusermount
是一个很有用的指令,如果挂载不成功就用这个指令取消挂载。但是偶尔会无法取消,显示device is busy,原因就是有进程占着这个文件夹。那么需要先ps aux|grep xzhou
找到自己的进程看看什么与此相关,然后kill -s 9 PROCESS_ID
,然后再取消挂载。- 当然也可以挂载其他服务器的anaconda(这时候注意源文件夹和目标文件夹的名字一致,考虑到不想修改环境变量),但是注意首先需要将本地的
~/.bashrc
文件注释掉conda部分再source指令,然后再挂载(不然会出现无响应),再取消注释再source指令 ln -s /tmp/test1.txt test2.txt
将在当前目录下创建符号文件“test2.txt”,ln -s /tmp/test1.txt
将在当前目录下创建符号文件“test1.txt”。删除链接符号文件语法是rm file
或者rm dir
- 文件夹简单合并命令:将1和2文件夹内容合并到3
mkdir 3;mv -i 1 3;mv -i 2 3
,这时候1和2文件夹就是空的了。但是当文件夹文件庞大时会报错-bash: /bin/mv: Argument list too long
,需要使用指令find 1 -name '*.*' -exec mv {} 3 \;
和find 2 -name '*.*' -exec mv {} 3 \;
- 将7行的文本分成前后两部分:
cat test.lst|head -n 3
(前3)cat test.lst|tail -n +4
(后4)
其他
cat std_std_wiki.txt|grep --color=always -n 'query'|less -R
显示查询的结构。-R是Repaint screen, discarding buffered input.
Mac对应Windows的按键
Command (or Cmd) ⌘
Shift ⇧
Option (or Alt) ⌥
Control (or Ctrl) ⌃
Caps Lock ⇪
文字处理
- Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出
PDF相关
PDF->TXT
pdftotext可以得到pdf对应的纯文本版本
字体嵌入
会议提交论文要求PDF字体嵌入
强制字体嵌入:1
2pdf2ps template.pdf
ps2pdf -dPDFSETTINGS=/prepress template.ps template.pdf
验证:pdffonts template.pdf
可以看到所有字体已被嵌入
显示PDF信息 (MacOS)
1 | brew install xpdf |
PDF修改作者等metadata (MacOS)
1 | brew install exiftool |
图像处理
Mac需要 brew install imagemagick才能使用convert
gif转一些列图片(帧为单位) convert test.gif test%05d.png
一系列png转视频 ffmpeg -i test%05d.png test.mp4
如果需要将视频速度变慢要加选项 -filter:v "setpts=2.0*PTS"
要让符合MP4V2格式需要加选项 -brand mp42
比如ffmpeg -i test%05d.png -filter:v "setpts=2.0*PTS" -brand mp42 test.mp4
系统
指令
getconf LONG_BIT
得到Linux系统是x86还是x32cat /proc/driver/nvidia/version
查看CUDA驱动版本who -b
查看最后一次系统启动的时间who -r
查看当前系统运行时间- 查看所用的桌面环境
env|grep DESKTOP=
lsb_release -a
查看系统版本(没有就用yum install lsb
或者cat /etc/os-release
)- 关机
shutdown -r now
安装软件的依赖库
Ubuntu:1
2
3sudo sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list
sudo apt-get update
sudo apt-get build-dep wine-stable
CentOS:1
yum-builddep -y wine
增加用户
先登录root用户
- adduser xzhou
- passwd xzhou 似乎不需要 因为第一步输入了密码
增加网络资源共享文件夹
- sudo nano /etc/samba/smb.conf
- sudo smbpasswd -a xzhou
- sudo service smbd restart
显卡 GPU计算
watch -n 1 nvidia-smi
每秒刷新一次 nvidia-smi
进程
ps ax | grep python
可以看到其他人在运行的Python代码- 已知PID查看指令所在目录:
lsof -p PID|grep cwd
kill -s 9 PID
强制杀死进程标识号PID的进程- 已知PID如何查看完整指令:
ps PID
- 已知端口查进程是
lsof –i:端口号
工具
- 实时查看网速
sudo apt-get install nethogs & sudo nethogs
- 查看公网IP
curl api.ipify.org
查看私有IPifconfig
远程控制
安装VNC-server
ps -ef|grep -i vnc
查看正在运行的vncserver的进程vncserver -kill :1
#关闭这个连接vncserver :1
重启vncserver
安装teamviewer或xrdp
美化和汉化man
汉化
sudo apt-get install sudo !!-zh
???- 查看man 手册安装到哪里,
dpkg -L manpages-zh | less
查看到安装在/usr/share/man/zh_CN - 设一个中文man别名, 修改 ~/.bashrc 添加一个alias :
alias cman='man -M /usr/share/man/zh_CN'
,或者用命令sed -i '$a alias cman="man -M /usr/share/man/zh_CN"' .bashrc
(在最后一行后增加一行,并写入文件) source ~/.bashrc
重启终端cman ls
就是汉化的man,man ls
就是英文的man
##美化sudo apt-get install most
- 修改 ~/.bashrc 添加一个环境变量 :
export PAGER="/usr/bin/most -s"
,或者用命令sed -i '$a export PAGER="/usr/bin/most -s"' .bashrc
(在最后一行后增加一行,并写入文件) source ~/.bashrc
重启终端man ls
就是英文的美化版的man
小技巧
让上一个命令以管理员身份执行
apt-get install ranger
然后报权限不足再敲入sudo !!
运行上一条命令
快捷键
命令行日常系快捷键
Ctrl + U - 剪切光标前的内容
Ctrl + K - 剪切光标至行末的内容
Ctrl + Y - 粘贴
Ctrl + E - 移动光标到行末
Ctrl + A - 移动光标到行首
Ctrl + F - 跳向下一个空格
Ctrl + B - 跳回上一个空格
Alt + Backspace - 删除前一个单词
Ctrl + W - 剪切光标后一个单词
Shift + Insert - 向终端内粘贴文本
暂停并在后台运行命令
Ctrl + Z - 暂停应用程序(比如正在用nano编辑test.txt)
fg - 重新将程序唤到前台
jobs - 查看任务数目
只要按Ctrl + Z,前台的命令就会暂停,画面就切回到命令行了。然后你就能运行你想要运行的命令,等命令运行完后在终端窗口输入fg就可以回到先前暂停的任务
下载
普通下载
使用axelapt-get install axel
使用简单 axel URL
我常用的指令:多线程(10个)下载并改变进度条样式:axel -n 32 -a URL
下载视频
使用you-get和youtube-dl以及硕鼠
从Youtube视频中下载音频(wav格式)支持b站
youtube-dl –extract-audio –audio-format wav URL
比如我想下载这个情非得已的音频
- 使用python3安装you-get
you-get http://www.miaopai.com/show/R~22buLsn55r7IVQKvMjZ4Le2mJ7PS7BqxjbAg__.htm
ffmpeg -i 阿卡贝拉版情非得已.mp4 -f mp3 -vn 阿卡贝拉版情非得已.mp3
参数解释:
-i 表示input,即输入文件
-f 表示format,即输出格式
-vn表示vedio not,即输出不包含视频play 阿卡贝拉版情非得已.mp3
(需要安装sox库)
后台下载视频
如果现在很多个b站视频需要下载,是不是就是CTRL + Z and fg 结合 youtube-dl,实践发现不行,挂起时下载会暂停。之前我玩过树莓派,很多Linux知识都是从那里学到的
所以我发现了screen命令. MacOS是自带的,Linux使用sudo apt-get install screen
安装
终端输入(Xshell软件里操作一样的):1
screen youtube-dl --extract-audio --audio-format mp3 https://www.bilibili.com/video/av6846882
它会下载第一个视频,这时候按住Ctrl+A然后Ctrl+D会回到终端,但是视频依然在下载,这时候再次终端输出新的视频PID,就会下载第二个,以此类推…
查看所以任务是screen -ls
,所有视频一旦完成下载,screen -ls
就会输出No Sockets found in bilibala...
。说明一个任务完成它会自动退出那个虚拟终端的
如果我们关闭终端不影响screen,不信你重新打开终端试试screen -ls
恢复一个虚拟终端命令是screen -r ID号
如果终端本身自己不能结束,就screen -r ID号
然后exit
虚拟化技术
Docker
指令
- 搜索镜像
docker search 镜像ID
- 使用后台运行(-d)容器
docker run -d 镜像ID
- 运行基于容器名
docker run --name mycontainer 镜像ID
- 运行时暴露端口
-p <host-port>:<container-port>
(如果没指定host-port,主机会随机指定一个可使用的port去和container的port做连接,此时可用docker port 容器ID 容器暴露的端口
或者docker ps
检查) - 运行时挂载宿主机目录
-v <host-dir>:<container-dir>
- 运行容器的shell命令
docker run -it ubuntu bash
- 查看当前正在运行的容器
docker ps
,显示已经退出的容器docker ps -a
- 列出容器详细信息,例如ip地址
docker inspect 容器ID
- 列出容器的标准输出stdout和stderr
docker logs 容器ID
- 显示所有镜像
docker images
- 启动/停止某个容器
docker start/stop 容器ID
- 删除镜像
docker rmi 镜像ID
- 删除所有TAG为
的镜像 docker images|grep none|awk '{print $3}'|xargs docker rmi
- 删除容器
docker rm 容器ID
- 删除所有容器
docker rm $(docker ps -aq)
- 在容器运行命令显示系统信息
docker run ubuntu cat /etc/os-release
,没有这个镜像则创建镜像(用完可删除容器) - 开启容器交互模式:
docker run -it ubuntu
exit退出 - 打开交互式终端
docker start -i 容器ID
,每次使用就使用这个命令就行
Dockerfile
一个范例:1
2
3
4
5FROM nginx:1.11-alpine
COPY index.html /usr/share/nginx/html
EXPOSE 80
# equal to nginx -g daemon off;
CMD ["nginx", "-g", "daemon off;"]
执行:docker build -t my-nginx-image:latest .
docker run -d -p 80:80 my-nginx-image:latest
curl -i http://docker
(得到完整的http response)
Dockerfile的ONBUILD指令:
- 旧dockerfile中有ONBUILD前缀的指令在docker build的时候不会执行
- 新的dockerfile在docker build的时候会完整执行基础镜像的dockerfile指令(包含ONBUILD 的)以及自己的dockerfile包含的指令
- 有效简短继承旧dockerfile时需要写的指令量
- 祖父dockerfile中的ONBUILD在孙子dockerfile做docker build时不会执行
使用.dockerignore可避免增加无用的文件或者敏感文件进入build的过程
建立Dockerfile
- 根据Dockerfile建立文件
docker build -t wineubuntu . --no-cache --rm
- ⚠️ Dockerfile不同于SingularityFile 它的建立每个RUN是独立的,因此涉及相对目录时要小心
- –no-cache代表不使用缓存,这样建立出错不能从中间某一步重来; –rm代表删除建立中的临时容器
-t <repository:tag>
表示生成镜像的repository名称(即image名称),以及通常作为区分不同版本的TAG- 提交至仓库
docker push xzhou2333/wineubuntu
镜像打包发布
- Docker Hub注册账户开启新的仓库并在终端登录此账号
docker login
docker commit 容器ID xzhou2333/winecentos
,这时候就多出一个镜像了docker push xzhou2333/winecentos
Singularity
指令
–H 指定家目录
–containall 指定以isolated的方式运行镜像(也就是说一般默认会挂载宿主机home目录,pwd当前工作目录以及/tmp目录,但是现在都不挂载)
–pwd 指定进入容器后的初始工作目录
镜像打包发布
- 注册Singularity Hub账户开启新的仓库
- 关联Github的Singularity仓库,例如
- 云端构建镜像 限时两小时
wine
Ubuntu
一般情况下简单的可以终端执行的exe执行就是:wine test.exe
首先wine不是windows模拟器也就基本没有性能损失。
我测试了wine的性能,使用的代码来自Perfect_numbers,OSX,Windows,Ubuntu,Ubuntu(Wine),执行时间分别是61.87s、58.89s、50.88s、50.93s。所以还真是很快,基本没有性能损失。
但是有一次我的C++工程是VS2015编译的,其中底层调用了windows.h,想在Linux编译很麻烦,因此尝试wine。另外这个exe是会调用MXNet的C++API(因为包含神经网络的前馈运算),需要以下Dll库
libgcc_s_seh-1.dll libgfortran-3.dll libmxnet.dll libopenblas.dll libquadmath-0.dll
在Linux上直接执行报错,说是某个函数有未实现的函数(wine: Call from 0x7b44cbda to unimplemented function vcomp140.dll._vcomp_for_static_simple_init_i8, aborting)
我是用VS2015编译的嘛所以wine的可能在vc运行时的版本低了,需要更新。它会下载原生vcomp140.dll然后更新覆盖原本的dll
终端执行winetricks -q vcrun2015
。
如果是用ssh连上的没有图形界面的话,可能需要使用xvfb-run winetricks -q vcrun2015
,让Linux模拟一个桌面(需要安装xvfb软件)
总结一下:
- 安装wine 见安装 WineHQ 安装包
sudo apt-get install cabextract
(第五步需要)- 退出sudo权限
- 安装Winetricks
- 为了运行由VS2015编译出来的程序安装vc2015运行时
xvfb-run ./winetricks -q vcrun2015
(可选,但是不安装有些软件可能无法运行,xvfb-run也是可选项) - 将dll与exe放在同一个目录下即可。
wine test.exe
CentOS
总结一下:
- 安装wine 见安装 WineHQ 安装包 CentOS/RHEL,然后
yum install xorg-x11-server-Xvfb wget
- 退出sudo权限
- 安装Winetricks,这时候一般64位的终端exe即可运行了(wine test.exe不行再敲一编就行了…)
- 为了运行由VS2015编译出来的程序安装vc2015运行时
./winetricks -q vcrun2015
(可选,但是不安装有些软件可能无法运行,xvfb-run也是可选项) 第四步报错:(fixme:service:scmdatabase_autostart_services Auto-start service L”MountMgr” failed to start: 2,fixme:service:scmdatabase_autostart_services Auto-start service L”WineBus” failed to start: 2)参考百度知道,即find / -name mountmgr.sys cp /usr/lib64/wine/fakedlls/mountmgr.sys /home/xzhou/.wine/drive_c/windows/system32/drivers/ find / -name winebus.sys cp /usr/lib64/wine/fakedlls/winebus.sys /home/xzhou/.wine/drive_c/windows/system32/drivers/
解决第五步之后第四步继续报错Bad EXE Format.因为CentOS 7没有32位版本,EPEL的wine 没有32位wine,只有64位wine。而vc_redist.x86.exe是一个32位程序。参考CentOS 7 使用 Yum 安装使用最新稳定版 Wine 3继续安装32位的wine安装完成后第四步的Bad EXE Format消除,错误变成0009:fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.Windows.Common-Controls" (6.0.0.0)
。- 然后实在找不到解决办法了。接第四步暴力解决,直接将上一个ubuntu方法的dll拷贝(下载链接见谷歌网盘)过来。
cp /home/xzhou/Downloads/vcomp140.dll /home/xzhou/.wine/drive_c/windows/system32
。完美解决
所以只需至少要执行1、2、3、4、8即可解决。
不过最好第五步也执行以下这样运行exe时少两个fixme警告
内网穿透
目前使用的是ngrok,如果从内网服务器下载软件会先python -m SimpleHTTPServer
再ngrok http 8000