使用环回文件
(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
(2) 用mkfs命令将1GB的文件格式化成ext4文件系统:
$ mkfs.ext4 loopbackfile.img
(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)
(4) 使用mkdir创建挂载点并挂载环回文件: # mkdir /mnt/loopback
# mount -o loop loopbackfile.img /mnt/loopback
选项-o loop用来挂载环回文件系统。 这里用的实际上是一种快捷方式,可以将环回文件系统附加到(attach)由操作系统选定
的设备上,这些设备的名称类似于/dev/loop1或/dev/loop2。
(5) 也可以使用以下命令来指定具体的环回设备:
# losetup /dev/loop1 loopbackfile.img # mount /dev/loop1 /mnt/loopback
(6) 使用下面的方法进行卸载(umount):
# umount mount_point
例如:
# umount /mnt/loopback
(7) 也可以用设备文件的路径作为umount命令的参数:
# umount /dev/loop1
生成ISO及混合型ISO文件
从/dev/cdrom创建一个ISO镜像:
# cat /dev/cdrom > image.iso
尽管可以奏效,但创建ISO镜像最好的方法还是使用dd命令:
# dd if=/dev/cdrom of=image.iso
mkisofs命令可以创建ISO镜像文件。该命令生成的输出文件能够被cdrecord这类实用工具 刻录到CD-ROM或DVD-ROM。我们需要将所有文件放入同一个目录中,然后用mkisofs命令将 整个目录中的内容写入ISO文件:
$ mkisofs -V "Label" -o image.iso source_dir/
其中选项-o指定了ISO文件的路径。source_dir是作为ISO文件内容来源的目录路径,选项-V 指定了ISO文件的卷标。
- 能够启动闪存或硬盘的混合型ISO
下面的命令能够制作出可引导的ISO文件:
# isohybrid image.iso
这个混合型ISO文件可用于写入USB存储设备。
将该ISO写入USB存储设备:
# dd if=image.iso of=/dev/sdb1
你可以用相应的设备代替/dev/sdb1,或者使用cat命令:
# cat image.iso >> /dev/sdb1
- 用命令行刻录ISO cdrecord命令可以将ISO文件刻入CD-ROM或DVD-ROM。 使用下列命令刻录CD-ROM:
# cdrecord -v dev=/dev/cdrom image.iso
使用-speed选项指定刻录速度:
-speed 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 5
- 玩转CD-ROM托盘
刻录CD-ROM时也可以采用多区段(multi-session)方式,这样就能在一张光盘上分多次 刻录数据。多区段刻录需要使用-multi选项:
$ eject
这个命令可以弹出光驱托盘。
$ eject -t
查找并修补文件差异
diff命令可以生成两个文件之间的差异对比。
(1) 先创建下列用于演示的文件。
文件 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
(2) 非一体化(nonunified)形式的diff输出(不使用-u选项)如下:
$ diff version1.txt version2.txt 3d2
<line3
6c5
> GNU is not UNIX
(3) 一体化形式的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
选项-u用于生成一体化输出。因为一体化输出的可读性更好,更易于看出两个文件之间 的差异,所以人们往往更喜欢这种输出形式。
在一体化diff输出中,以+起始的是新加入的行,以-起始的是被删除的行。
(4) 修补文件可以通过将diff的输出重定向到一个文件来生成:
$ diff -u version1.txt version2.txt > version.patch
现在就可以用patch命令将变更应用于其中任意一个文件。当应用于version1.txt时,就可 以得到version2.txt;而当应用于version2.txt时,就得到了version1.txt。
(5) 用下列命令来进行修补:
$ patch -p1 version1.txt < version.patch
patching file version1.txt
version1.txt的内容现在和version 2.txt一模一样了。
(6) 下列命令可以撤销作出的变更:
$ patch -p1 version1.txt < version.patch
patching file version1.txt
Reversed (or previously applied) patch detected! Assume -R? [n] y # 变更被撤销
如上例所示,对已修补过的文件再修补将撤销作出的变更。如果使用patch命令的-R选 项,则不会提示用户y/n。
生成目录的差异信息
diff命令也能够以递归的形式处理目录。它会对目录中的所有内容生成差异对比。使用下 面的命令:
$ diff -Naur directory1 directory2
该命令中出现的选项含义如下。
-N:将缺失的文件视为空文件。
-a:将所有文件视为文本文件。
-u:生成一体化输出。
-r:递归遍历目录下的所有文件。
使用head与tail打印文件的前10行和后10行
head命令总是读取输入文件的起始部分。
(1) 打印前10行:
$ head file
(2) 从stdin读取数据:
$ cat text | head
(3) 指定打印前几行:
$ head -n 4 file
该命令会打印出文件的前4行。
(4) 打印除了最后M行之外所有的行:
$ head -n -M file
(5) 打印除最后几行之外的其他行是head的一种常见用法。在检查日志文件时,我们通常要 查看最近(也就是最后)的若干行。
(6) 打印文件的最后10行:
$ tail file
(7) 从stdin中读取输入:
$ cat text | tail
(8) 打印最后5行:
$ tail -n 5 file
(9) 打印除了前M行之外所有的行:
$ tail -n +(M+1)
只列出目录的各种方法
可以依据下列方法列出当前路径下的目录。
(1) 使用ls -d:
$ ls -d */
(2) 使用grep结合ls -F:
$ ls -F | grep "/$"
(3) 使用grep结合ls -l:
$ ls -l | grep "^d"
(4) 使用find:
$ find . -type d -maxdepth 1 -print
在命令行中使用pushd和popd实现快速定位
可以使用pushd和popd来代替cd命令。
(1) 压入并切换路径:
~ $ pushd /var/www
(2) 再压入下一个目录路径:
/var/www $ pushd /usr/src
(3) 查看栈的内容:
$ dirs
/usr/src /var/www ~ /usr/share /etc
(4) 当你想切换到栈中任意一个路径时,将每条路径从0编号到n,然后使用你希望切换到的 路径编号。例如:
$ pushd +3
这条命令会将栈进行翻转并切换到目录/usr/share。
pushd总是向栈中添加路径。如果要从栈中删除路径,可以使用popd。
(5) 删除最近压入的路径并切换到下一个目录:
$ popd
假设现在栈包含/usr/src /var/www ~ /usr/share /etc,当前目录是 /usr/src,popd会将栈更
改为/var/www ~ /usr/share /etc,然后把当前目录切换至/var/www。
(6) 用popd +num可以从栈中移除特定的路径。num是从左到右、从0到n开始计数的。
统计文件的行数、单词数和字符数
(1) 统计行数:
$ wc -l file
(2) 如果需要将stdin作为输入,使用下列命令:
$ cat file | wc -l
(3) 统计单词数:
$ wc -w file
$ cat file | wc -w
(4) 统计字符数:
$ wc -c file
$ cat file | wc -c
我们可以按照下面的方法统计文本中的字符数:
echo -n 1234 | wc -c 4
-n用于避免echo添加额外的换行符
(5) 不使用任何选项时,wc会打印出行、单词和字符的数量:
$ wc file
1435 15763 112200
这些分别是文件的行数、单词数和字符数。
(6) 使用-L选项打印出文件中最长一行的长度:
$wcfile-L 205
打印目录树
tree
$ tree ~/unixfs unixfs/
|-- bin
| |-- cat
| `--ls
|-- etc
| `-- |-- home
| |--
| |
passwd
pactpub
|-- automate.sh `-- schedule slynux
| |
| `--
|-- opt
|-- tmp
`-- usr
8 directories, 5 files
-P选项可以只显示出匹配指定模式的文件:
$ tree path -P PATTERN
例如:
$ tree PATH -P ’*.sh’ |-- home
| |-- packtpub
| | `-- automate.sh
# 使用通配符描述模式并将其放入单引号中
# 使用目录路径替换PATH
-I选项可以只显示出不匹配指定模式的文件:
$ tree path -I PATTERN
-h选项可以同时打印出文件和目录的大小:
$ tree -h
处理视频与图像文件
这个脚本可以接受一组图片,然后从中生成一段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