Linux_Shell脚本学习第三章-以文件之名(下)

一、使用环回文件

1.1 在大小为1GB的文件中创建ext4文件系统

1.1 使用dd命令创建一个1GB大小的文件

$ dd if=/dev/zero of=loobackfile.img bs=1G count=1
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 37.3155 s, 28.8 MB/s

你会发现创建好的文件大小超过了1GB。这是因为作为块设备,硬盘是按照块大小的整数倍来分配存储空间的。

1.2 用mkfs命令将1GB的文件格式化成ext4文件系统

$ mkfs.ext4 loopbackfile.img

1.3使用file命令检查文件系统

$ file loobackfile.img
loobackfile.img: Linux rev 1.0 ext4 filesystem data,
UUID=c9d56c42-
f8e6-4cbd-aeab-369d5056660a (extents) (large files) (huge files)

1.4 使用mkdir创建挂载点并挂载环回文件

# mkdir /mnt/loopback
# mount -o loop loopbackfile.img /mnt/loopback

选项-o loop用来挂载环回文件系统。
这里用的实际上是一种快捷方式,可以将环回文件系统附加到(attach)由操作系统选定的设备上,这些设备的名称类似于/dev/loop1或/dev/loop2。

1.5 也可以使用以下命令来指定具体的环回设备

# losetup /dev/loop1 loopbackfile.img
# mount /dev/loop1 /mnt/loopback

1.6 使用下面的方法进行卸载(umount)

# umount mount_point

例如:

# umount /mnt/loopback

1.7 也可以用设备文件的路径作为umount命令的参数

# umount /dev/loop1

1.2 在环回镜像中创建分区

假设我们需要创建一个环回文件,然后对其分区并挂载其中某个分区。在这种情况下,没法使用mount - o loop。我们必须手动建立设备并挂载分区。

使用下面的方法对文件(内容全部填充为0)进行分区:

# losetup /dev/loop1 loopback.img
# fdisk /dev/loop1

在loopback.img中创建分区并挂载第一个分区:

# losetup -o 32256 /dev/loop2 loopback.img

/dev/loop2表示第一个分区,-o用来指定偏移量,在DOS分区方案①中,这个偏移量是32256。第一个分区在硬盘上起始于32 256字节处。

1.3 使用sync立刻应用更改

对挂载设备作出的更改并不会被立即写入物理设备。只有当内部缓冲区被写满之后才会回写设备。我们可以用sync命令强制立刻写入更改:

$ sync

二、生成ISO及混合型ISO文件

2.1 ISO简介

ISO镜像是一种存档格式,它存储了如CD-ROM、DVD-ROM等光盘的精准镜像。ISO文件通常用于存储待刻录的数据。

2.2 创建ISO镜像

2.2.1 cat

# cat /dev/cdrom > image.iso

2.2.2 dd

# dd if=/dev/cdrom of=image.iso

2.2.3 mkisofs

mkisofs命令可以创建ISO镜像文件。该命令生成的输出文件能够被cdrecord这类实用工具刻录到CD-ROM或DVD-ROM。我们需要将所有文件放入同一个目录中,然后用mkisofs命令将整个目录中的内容写入ISO文件:

$ mkisofs -V "Label" -o image.iso source_dir/

其中选项-o指定了ISO文件的路径。source_dir是作为ISO文件内容来源的目录路径,选项-V指定了ISO文件的卷标。

2.3 能够启动闪存或硬盘的混合型ISO

通常无法通过将可引导的ISO文件写入USB存储设备来创建可引导的U盘。但是有一种被称为“混合ISO”的特殊ISO文件可以实现这一点。

下面的命令能够制作出可引导的ISO文件:

# isohybrid image.iso

将该ISO写入USB存储设备:

# dd if=image.iso of=/dev/sdb1

或者

# cat image.iso >> /dev/sdb1

2.3 用命令行刻录ISO

cdrecord命令可以将ISO文件刻入CD-ROM或DVD-ROM。
使用下列命令刻录CD-ROM:

# cdrecord -v dev=/dev/cdrom image.iso

使用-speed选项指定刻录速度:
例如:

# cdrecord -v dev=/dev/cdrom image.iso -speed 8

参数8表明其刻录速度为8x。

刻录CD-ROM时也可以采用多区段(multi-session)方式,这样就能在一张光盘上分多次刻录数据。多区段刻录需要使用-multi选项:

# cdrecord -v dev=/dev/cdrom image.iso -multi

2.4 玩转CD-ROM托盘

如果你用的是桌面电脑,。

$ eject

这个命令可以弹出光驱托盘。

$ eject -t

这个命令可以合上光驱托盘。

三、查找并修补文件差异

3.1 diff

3.1.1 生成两个文件之间的差异对比

diff命令可以生成两个文件之间的差异对比。
先创建下列用于演示的文件。
文件 1:version1.txt

this is the original text
line2
line3
line4
happy hacking !

文件 2:version2.txt

this is the original text
line2
line4
happy hacking !
GNU is not UNIX

非一体化(nonunified)形式的diff输出(不使用-u选项)如下

$ diff version1.txt version2.txt
3d2
<line3
6c5
> GNU is not UNIX

一体化形式的diff输出如下:

$ diff -u version1.txt version2.txt
--- version1.txt 2010-06-27 10:26:54.384884455 +0530
+++ version2.txt 2010-06-27 10:27:28.782140889 +0530
@@ -1,5 +1,5 @@
this is the original text
line2
-line3
line4
happy hacking !
-
+GNU is not UNIX

在一体化diff输出中,以+起始的是新加入的行,以-起始的是被删除的行。

修补文件可以通过将diff的输出重定向到一个文件来生成

$ diff -u version1.txt version2.txt > version.patch

用下列命令来进行修补:

$ patch -p1 version1.txt < version.patch
patching file version1.txt

version1.txt的内容现在和version 2.txt一模一样了。

下列命令可以撤销作出的变更:

$ patch -p1 version1.txt < version.patch
patching file version1.txt
Reversed (or previously applied) patch detected! Assume -R? [n] y
# 变更被撤销

如上例所示,对已修补过的文件再修补将撤销作出的变更。如果使用patch命令的-R选项,则不会提示用户y/n。

3.1.2 生成目录的差异信息

diff命令也能够以递归的形式处理目录。它会对目录中的所有内容生成差异对比。使用下面的命令:

$ diff -Naur directory1 directory2

该命令中出现的选项含义如下。
 -N:将缺失的文件视为空文件。
 -a:将所有文件视为文本文件。
 -u:生成一体化输出。
 -r:递归遍历目录下的所有文件。

四、使用head 与tail打印文件的前10行和后10行

4.1 head

4.1.1 打印前10行

$ head file

4.1.2 从stdin读取数据:

$ cat text | head

4.1.3 指定打印前几行:

$ head -n 4 file

该命令会打印出文件的前4行。

4.1.4 打印除了最后M行之外所有的行

$ head -n -M file

注意,这里的-M表示的是负数,并非选项。
例如,用下面的命令可以打印出除最后5行之外的所有行:

$ seq 11 | head -n -5
1
2
3
4
5
6

而下面的命令会打印出文件的第1行至第5行:

$ seq 100 | head -n 5

4.2 tail

4.2.1 打印文件的最后10行

$ tail file

4.2.2 从stdin中读取输入

$ cat text | tail

4.2.3 打印最后5行

$ tail -n 5 file

4.2.4 打印除了前M行之外所有的行

$ tail -n +(M+1)

例如,打印除前5行之外的所有行,M+1=6,因此使用下列命令:

$ seq 100 | tail -n +6

这条命令将打印出第6行至第100行。

4.2.5 是监视一个内容不断增加的文件(例如系统日志文件)中出现的新行

为了能够监视文件的增长,tail有一个特殊的选项-f或–follow,允许tail关注文
件内容的更新并将其显示出来:

$ tail -f growing_file

你可能希望将该命令用于日志文件。监视文件内容增加的命令如下:

# tail -f /var/log/messages

或者

$ dmesg | tail -f

4.2.6 tail在指定进程结束后随之结束运行

假设进程Foo在向一个我们正在监视的文件中追加数据。那么tail -f应该一直执行到进程Foo结束。

$ PID=$(pidof Foo)
$ tail -f file --pid $PID

当进程Foo结束之后,tail也会跟着结束。
创建一个新文件file.txt,使用你惯用的文本编辑器打开这个文件。
现在运行下列命令

$ PID=$(pidof gedit)
$ tail -f file.txt --pid $PID

向文件添加新行并不断地保存文件。
当你更新文件时,新添加的内容都会被tail命令写入终端。关闭文本编辑器后,tail命令也会随之结束。

五、只列出目录的各种方法

5.1 列出当前路径下的目录

5.1.1 使用ls -d

$ ls -d */

5.1.2 使用grep结合ls -F:

$ ls -F | grep "/$"

当使用ls的-F选项时,所有的输出项后面都会多出一个代表文件类型的字符,如@、*、|等。目录对应的是/字符。我们用grep只过滤那些行尾标记为/$的输出项。

5.1.3 使用grep结合ls -l:

$ ls -l | grep "^d"

ls –l输出的每一行的首字符表示文件类型。目录的文件类型字符是d。因此我们用grep过滤以d起始的行。^是行首标记。

5.1.4 使用find:

$ find . -type d -maxdepth 1 -print

六、在命令行中使用pushd 和popd 实现快速定位

pushd和popd可以用于在多个目录之间切换而无需重新输入目录路径。这两个命令会创建一个路径栈,它是一个保存了已访问目录的LIFO列(LastInFirstOut,后进先出)。

6.1 使用pushd和popd来代替cd命令

6.1.1 压入并切换路径

~ $ pushd /var/www

现在栈中包含/var/www ~,当前目录为 /var/www。

6.1.2 再压入下一个目录路径

/var/www $ pushd /usr/src

现在栈中包含/usr/src /var/www ~,当前目录为/usr/src。
你可以根据需要压入更多的目录路径。

6.1.3 查看栈的内容

$ dirs
/usr/src /var/www ~ /usr/share /etc
0          1               2            3       4

6.1.4 当你想切换到栈中任意一个路径时,将每条路径从0编号到n,然后使用你希望切换到的路径编号

$ pushd +3

这条命令会将栈进行翻转并切换到目录/usr/share。
pushd总是向栈中添加路径。如果要从栈中删除路径,可以使用popd。

6.1.5 删除最近压入的路径并切换到下一个目录

$ popd

假设现在栈包含/usr/src /var/www ~ /usr/share /etc,当前目录是 /usr/src,popd会将栈更改为/var/www ~ /usr/share /etc,然后把当前目录切换至/var/www。

6.1.6 用popd +num可以从栈中移除特定的路径。num是从左到右、从0到n开始计数的

6.2 cd -

假设当前路径是 /var/www,执行下面的命令:

/var/www $ cd /usr/src
/usr/src $ # 做点什么

现在要切换回 /var/www,不需要再输入/var/www了,只执行:

/usr/src $ cd -

你还可以再切换到 /usr/src:

/var/www $ cd -

七、统计文件的行数、单词数和字符数

7.1 wc

wc是一个用于统计行、单词和字符数量的实用工具。它是Word Count(单词计数)的缩写。wc支持多种选项来统计行数、单词数和字符数。

7.1.1 统计行数

$ wc -l file
$ cat file | wc -l

7.1.2 统计单词数

$ wc -w file
$ cat file | wc -w

7.1.3 统计字符数

$ wc -c file
$ cat file | wc -c

我们可以按照下面的方法统计文本中的字符数

echo -n 1234 | wc -c
4

-n用于避免echo添加额外的换行符。

7.1.4 不使用任何选项时,wc会打印出行、单词和字符的数量

$ wc file
1435 15763 112200

这些分别是文件的行数、单词数和字符数。

7.1.5 使用-L选项打印出文件中最长一行的长度

$ wc file -L
205

八、打印目录树

8.1 tree

tree命令能够以图形化的树状结构打印文件和目录。

8.1.1 示例

tree ~/unixfs
unixfs/
|-- bin
| |-- cat
| `-- ls
|-- etc
| `-- passwd
|-- home
| |-- pactpub
| | |-- automate.sh
| | `-- schedule
| `-- slynux
|-- opt
|-- tmp
`-- usr
8 directories, 5 files

tree命令支持多种选项。

8.1.2 -P选项可以只显示出匹配指定模式的文件

$ tree path -P PATTERN # 使用通配符描述模式并将其放入单引号中

例如:

$ tree PATH -P ’*.sh’ # 使用目录路径替换PATH
|-- home
| |-- packtpub
| | `-- automate.sh

8.1.3 -I选项可以只显示出不匹配指定模式的文件

$ tree path -I PATTERN

8.1.4 -h选项可以同时打印出文件和目录的大小

$ tree -h

九、处理视频与图像文件

9.1 提取视频中的音频

下面的命令能够将mp4视频文件(FILE.mp4)中的音频部分提取成mp3文件(OUTPUTFILE.mp3):

ffmpeg -i FILE.mp4 -acodec libmp3lame OUTPUTFILE.mp3

9.2 使用一组静态图像制作视频

这个脚本可以接受一组图片,然后从中生成一段MPEG视频

$ cat stills2mpg.sh
echo $* | tr ' ' '\n' >files.txt
mencoder mf://@files.txt -mf fps=24 -ovc lavc \
-lavcopts vcodec=msmpeg4v2 -noskip -o movie.mpg

将上面的命令复制/粘贴到一个文件中,将文件命名为stills2mpg.sh,设置可执行权限,然后按照下列形式调用:

./stills2mpg.sh file1.jpg file2.jpg file3.jpg ...

或者

./stills2mpg.sh *.jpg

mencoder命令要求输入文件采用固定的格式,一行只能有一个图像文件名。脚本的第一行将所有的命令行参数传给tr命令,后者负责将作为分隔符的空格转换为换行符。这样就将单行文件列表变成了多行文件列表(一行一个)。

你可以通过设置FPS(frames-per-second,帧速)来改变视频的播放速度。例如,将FPS修改成1会产生幻灯片的效果,每秒钟播放一帧。

9.3 使用静态照片生成平移视频

相机拍摄的照片通常要比视频的尺寸更大(分辨率更高)。你可以使用convert提取大尺寸照片中的某些部分,然后使用mencoder将其拼合在一起,形成平移镜头

$> makePan.sh
# 调用方法:
# sh makePan.sh OriginalImage.jpg prefix width height xoffset yoffset
# 清除旧数据
rm -f tmpFiles
# 创建200张静态图片,每次移动xoffset和yoffset个像素

for o in `seq 1 200`
do
x=$[ $o+$5 ]
convert -extract $3x$4+$x+$6 $1 $2_$x.jpg
echo $2_$x.jpg >> tmpFiles
done
#将图片拼合成mpg视频文件
mencoder mf://@tmpFiles -mf fps=30 -ovc lavc -lavcopts \
vcodec=msmpeg4v2 -noskip -o $2.mpg

这个脚本比我们之前见过的脚本都要复杂。它使用了7个命令行参数,分别指定了输入图片、输出文件前缀、临时图片的宽度和高度以及原始图片的起始偏移。
在for循环中,脚本创建了一组图片并将其文件名保存在名为tmpFiles的文件中。最后,使用mencoder将提取出的图片合并成能够导入视频编辑器(如kdenlive或OpenShot)的MPEG视频

©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值