Shell指令

语法基础

作为可执行程序

将代码保存为name.sh,并 cd 到相应目录

chmod +x ./test.sh #使脚本具有执行权限

./test.h 运行,或者将文件拖入终端运行

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器(sh、bash、php等等)来执行。

使用模版

1
2
3
4
5
#!/bin/bash
echo "Hello World !"
ffmpeg -r 30 -i output/%05d.jpg -vcodec libx264 -vf zscale=matrix=709:r=full output.mp4
mkdir backlit
ffmpeg -i backlit.mp4 -r 30 backlit/%05d.png

https://www.runoob.com/linux/linux-command-manual.html

Shell脚本书写规范 - That’s_it - 博客园

文件操作

1
2
3
4
5
6
7
8
9
10
删除文件
rm -r *.pdf
但是一次性删除太多的话就会报错 zsh: argument list too long: rm 此时用
find . -name "*.pdf" -print0 | xargs -0 rm

移动文件
mv folder2/*.* folder/
移动太多会报错
find folder2 -name '*.*' -exec mv {} folder \;
-exec runs any command, {} inserts the filename found, \; marks the end of the exec command.

linux - Argument list too long error for rm, cp, mv commands - Stack Overflow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查看当前路径下文件个数(不包括下一级子目录里文件个数)
ls -l | grep "^-" | wc -l
查看当前路径下文件个数(包括下一级子目录里文件个数)
ls -lR| grep "^-" | wc -l
查看某目录下文件夹(目录)的个数(包括子目录)
ls -lR | grep "^d" | wc -l

命令解析:
ls -l
长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR是列出所有文件,包括子目录。

grep "^-"
过滤ls的输出信息,只保留一般文件,只保留目录是grep "^d"。

wc -l
统计输出信息的行数,统计结果就是输出信息的行数,一行信息对应一个文件,所以就是文件的个数。

Linux统计文件夹下的文件数目 | SnailTyan