Linux Shell 用法(三)2.文件的相关操作

使用环回文件

(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文件的卷标。

  1. 能够启动闪存或硬盘的混合型ISO
    下面的命令能够制作出可引导的ISO文件:
# isohybrid image.iso

这个混合型ISO文件可用于写入USB存储设备。
将该ISO写入USB存储设备:

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

你可以用相应的设备代替/dev/sdb1,或者使用cat命令:

 # cat image.iso >> /dev/sdb1
  1. 用命令行刻录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 
  1. 玩转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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值