Linux中重要的思想,一切皆文件。

所有操作都离不开文件,可以利用他们进行各种与系统或进程相关的处理工作。

1、生成任意大小的文件

由于各种原因,你可能需要生成一个包含随机数据的文件。这可能是用于执行测试的测试文件,

比如用一个大文件作为输入来测试应用程序的效率,也可能是测试文件分割,或是创建环回文件系统。

dd:dd命令,创建特定大小的大文件最简单的方法就是利用dd命令。

shell脚本里执行mysqldump shell脚本里执行dd命令_文件管理

该命令会创建一个1MB大小的文件,test.data。 if代表输入文件(input file),of代表输出文件(output file),

bs代表以字节为单位的块大小(block size),count代表需要被复制的块数。

使用dd命令的时候,一定要小心,该命令运行在设备底层,要是一不小心出了差错,可能会把磁盘清空或是损坏数据。

上面的例子中,我们将bs指定为1MB,count指定为1,于是得到一个大小为1MB的文件。

如果把bs设为2MB,count设为2,那么总文件大小就是4MB。

也可以用dd命令传输大量数据并观察命令输出来测量内存的操作速度 。

2、文本文件中的交集和差集

comm命令可以用于两个文件之间的比较。它有很多不错的选项可以用来调整输出,以便我们执行交集,求差以及差集操作。

交集:打印出两个文件所共有的行。

求差:打印出指定文件所包含的且互不相同的那些行。

差集:打印出包含在文件A中,但是不包含在其他指定文件中的那些行。

需要注意的是comm命令必须使用排过序的文件作为输入。

shell脚本里执行mysqldump shell脚本里执行dd命令_shell脚本里执行mysqldump_02

输出的第一列只在A.txt中出现的行,第二列包含只在B.txt中出现的行,第三列包含A.txt和B.txt中相同的行。各列以

制表符作为定界符。

2.1 为了打印两个文件的交集,我们需要删除第一列和第二列,只打印出第三列

shell脚本里执行mysqldump shell脚本里执行dd命令_shell脚本_03

2.2打印出两个文件中不相同的行:

shell脚本里执行mysqldump shell脚本里执行dd命令_shell脚本_03

comm命令选项可以按照需求对输出进行格式化

-1:从输出中删除第一列

-2:从输出中删除第二列

-3:从输出中删除第三列

3、查找并删除重复文件

重复文件是同一个文件的多个副本,有时候需要删除重复的文件,只保留其中一份。

通过查看文件内容来辨识重复文件可以结合多种shell工具来完成。

脚本信息详见脚本收录

4、文件权限,所有权和粘滞位

文件权限和所有权是Linux文件系统(如ext文件系统)最显著的特性之一。

在Linux平台工作时,经常会碰到与文件权限和所有权相关问题。

Linux系统中的每一个文件都与多种类型的权限相关联。在这些权限中,通常要和三类权限打交道(用户,用户组以及其他用户)

用户(user)是文件的所有者,用户组(group)是多个用户的集合(由系统管理员指定),系统允许这些用户对文件进行某种形式的访问。

其他用户(others)是除文件用户或用户组之外的的任何人。。

用户除了基本的rwx(第一组)权限外, 还有一个称为setuid(S)的特殊权限。他出现在执行权限(x)的位置。

setuid权限允许用户以其拥有者的权限来执行可执行文件,即使这个可执行文件是由其他用户运行的。

用户组除了基本的rwx(第二组)权限外,还有一个称为setgid(S)位。

他允许以同该目录拥有者所在组相同的有效组权限来允许可执行文件。但是这个组合实际发起命令的用户组未必相同。

其他用户rwx(第三组),最后三个字符是其他用户权限,和用户以及用户组一样,其他用户也有读写执行权限,但是并没有S权限。

目录有一个特殊的权限,叫做粘滞位。 如果目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户

也有写权限,也无能为力 。粘滞位出现在其他用户权限的执行权限(x)位置。 用t或者T表示,如果没有设置执行权限,但设置了粘滞位,

就使用t,如果同时设置了执行权限和粘滞位,就使用T 。

4.1 设置文件权限

chmod命令设置文件权限。

chmod u=rwx g=rw o=r filename

可以对用户,用户组和其他用户用+进行添加权限,-删除权限

chmod o+x filename

给所有权限类别增加可执行权限:

chmod a+x filename

4.2 读写执行权限都有与之对应的唯一的八进制数

r=4

w=2

x=1

rwx = 4+2+1 =7

rw =4+2=6

r-- =4

所以rwxrw-r--等于764,使用八进制设置权限的命令为:

chmod 764 filename

4.3 更改所有权

chown user.group filename

例如:

chown sly.sly test.sh

在这里sly即使用户名,也是用户组名

4.4设置粘滞位

粘滞位是一种应用于目录的权限类型。通过设置粘滞位,使得只有目录的所有者才能删除目录的文件,即使用户组合其他用户

拥有足够的权限也不能执行删除操作。

设置粘滞位,利用chomod将+t应用于目录:

chmod a+t dir_name

4.5 以递归的方式设置权限

有时候需要以递归的方式修改当前目录下的所有文件和子目录的权限:

结合-R这个选项指定以递归的方式修改权限

chmod 777 . -R # . 表示当前工作目录

4.6 以递归的方式设置所有权

chown 命令结合-R 选项就可以以递归的方式设置所有权

chown user.group . -R

4.7 以不同的身份运行可执行文件

一些可执行文件需要以不同的用户身份(启动该文件的当前用户之外的用户),通过文件路径来执行(./executable_name)

有一个叫做setuid的特殊文件权限,它允许其他用户以文件所有者的身份来执行文件。

setuid的使用不是没有限制的,为了确保安全,它只能应用在Linux ELF格式二进制文件上,而不能用于脚本文件。

5、创建不可修改的文件

在常见的Linux扩展文件系统中,如(ext2,ext3,ext4),可以借助某种文件属性将文件设置为不可修改。

一旦设置,任何用户(包括超级用户)都不能删除文件,除非其不可修改的属性被移除。通过查看/etc/mtab文件,我们很容易知道

所挂载分区的文件系统类型。这个文件的第一列制定了分区设备的路径,第三列指定了文件系统 类型。

shell脚本里执行mysqldump shell脚本里执行dd命令_shell脚本_05

不可修改属性是避免文件被篡改的安全手段之一。/etc/resolv.conf文件就是这样的一个例子。

chattr能够将文件设置为不可修改。不过chattr能做的可不止这些。

5.1 使用下列命令将一个文件设置为不可修改:

chattr +i file

如果需要使文件恢复可写状态,移除不可修改属性即可

chattr -i file

6、批量生成空白文件

touch命令可以用来生成空白文件或是修改文件的时间戳(如果文件已经存在)。

6.1 创建一个空白文件

touch filename

6.2 批量生成不同命令的空白文件

for name in {1..100}.txt

do

touch $name

done

如果文件已经存在,那么touch命令会将该文件相关的所有时间戳都更改为当前时间。

如果只想更改某些时间戳,

touch -a 只更改文件的访问时间

touch -m 只更改文件内容修改时间

6.3 除了将时间戳更改为当前时间,还可以为时间戳指定特定的时间和日期

使用-d选项

7、查找符号链接及其指向目标

符号链接在类Unix系统中很常见。符号链接只不过是指向其他文件的指针。它在功能上和win中快捷方式很像。

删除符号链接不会影响到原始文件。

7.1 创建符号链接

ln -l -s /var/www ~/web

这个命令在已经登录用户的home目录中创建一个名为web的符号链接。该链接指向/var/www

7.2 打印当前目录下的符号链接

ls -l | grep "^l"

7.3 使用readlink打印出符号链接所指向的目标路径。

readlink 符号链接文件名

8、列举文件类型统计信息

文件类型种类繁多。

8.1 打印文件类型信息

file filename

8.2 打印不包括文件名在内的文件类型信息:

file -b filename

9、使用环回文件

环回文件系统时Linux系统中很有趣的部分。通常是在设备上(如磁盘分区)创建文件系统,这些存储设备能够以设备

文件的形式来使用。

环回文件系统时指那些在文件中而非物理设备中创建的文件系统。我们可以将这些文件作为文件系统挂载到挂载点上。

这实际上可以让我们在物理磁盘上的文件中创建逻辑磁盘。

9.1 在环回镜像中创建分区

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

# losetup /dev/loop1 loopback.img

# fdisk /dev/loop1

10、生成ISO文件及混合性ISO

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

使用下面的命令从/dev/cdrom创建爱你一个ISO镜像

cat /dev/cdrom > image.iso

使用dd工具创建ISO镜像

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

mkisofs命令用于创建ISO文件系统。可以用cdrecord之类的工具将mkisofs 的输出文件直接刻录到CD-ROM或DVD-ROM。

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

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

isohybrid image.iso #执行命令,获得一个名为image.iso的混合ISO,它可用于写入USB存储设备

将ISO写入USB存储设备

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

可以使用适当的设备代替/dev/sdb1,或者使用cat命令:

cat image.iso >> /dev/sdb1

10.2 用命令行刻录ISO

cdrecord 可以用来将ISO文件刻入CD-ROM或DVD-ROM。

cdrecord -v dev=dev/cdrom image.iso

11、文件校验与核实

校验和(checksum)程序用来从文件中生成校验和密钥,然后利用这个校验和密钥核实文件的完整性。

11.1计算md5sum

md5sum filename

md5sum是一个32个字符的十六进制串,对文件内容使用相应的算法来生成校验和。

与md5sum类似,SHA-1是另一种常用的校验和算法。

他从给定的输入文件中生成一个长度为40个字符的十六进制串。用来计算SAH-1串的命令是sha1sum,用法和md5sum非常相似。

11.2 对目录进行校验

校验和是从文件中计算得来的。对目录计算校验意味着我们需要对目录中的所有文件以递归的方式进行计算。

可以使用命令md5deep或sha1deep来实现。

11.3 加密工具和散列

加密技术主要用于防止数据遭受未经许可的访问。加密算法有很多,着重讲解那些常见的标准加密算法。

crypt 是一个简单的加密工具,从stdin接受一个文件以及口令作为输入,然后将加密数据输入到stdout。(因此对输入,输出使用重定向)

crypt <input_file >output_file

会要求输入一个密码。

它会要求输入一个口令。我们也可以通过命令行参数来提供口令。

$ crypt PASSPHRASE <input_file >encrypted_file

如果需要解密文件,可以使用:

$ crypt PASSPHRASE -d <encrypted_file >output_file

gpg命令。是一种应用广泛的工具,它使用加密技术来保护文件,以确保数据在送达目的地之前无法被读取。

用gpg加密文件:

gpg -c filename

解密gpg文件

gpg filename.gpg

12、查找文件差异并进行修补

当一个文件有多个版本时,需要重点标记出这些版本之间的不同无须通过人工查看来比较。

12.1 diff命令

diff命令可以生成差异文件

diff filename filename

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

diff -u filename filename

选项-u用于生成一体化输出。因为一体化输出的可读性更好。

12.3 修补文件通过diff输出重定向到一个文件来生成

diff -u filename1 filename2 > filename3

12.4 用下列命令进行修补

path -p1 filename < filename2

12.5 生成目录的差异信息

diff命令能够以递归的形式作用于目录

-N : 将所有缺失的文件视为空文件

-a :将所有文件视为文本文件

-u :生成一体化输出

-r : 遍历目录下的所有文件

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

有时候可能需要打印文件的前n行或者后n行,也有可能需要打印出除了前n行或者后n行之外的所有的行

13.1 head命令总是读取输入文件的头部(默认打印10行)

打印前10行

head file

指定打印前几行

-n选项后面加数字可以指定打印文件的前几行

head -n 4 file 或则是 head -4 file

-n - 这是一个负号,指打印除了最后几行外的所有的行

head -n -4 file #打印除了后4行之外的所有的行

13.2 tail命令总是读取文件的尾部(默认打印后10行)

打印文件后10行

tail file

打印后几行

tail -n 5 file #打印后5行

打印除了前几行之外的所有的行

tail -n -5 file #打印除了前5行之外的所有的行

tail有一个特殊的选项

-f 会使tail密切关注文件中新添加的内容,并随着数据增加持续更新

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

有很多方法可以只列出目录。

14.1 使用ls -d

ls -d */

14.2 使用grep 结合ls -F

ls -F | grep “/$”

14.3 使用grep结合 ls -l

ls -l | grep “^d”

14.4 使用find

find . -type d -maxdepth 1 -print

15、在命令行中使用pushd 和popd进行快速定位

pushd和popd可以用于在多个目录之间进行切换而无需复制粘贴路径。

pushd和popd以栈的方式来运作。

使用pushd和popd时可以无视cd命令。

15.1 压入并切换路径

pushd /var/www #现在栈中包含了/var/www ,当前目录切换到/var/www

15.2 再压入下一个目录路径

/var/www # pushd /usr/src

现在栈中包含/usr/src /var/www ,当前目录为/usr/src

15.3 用下面的命令查看栈的内容

dirs 命令

15.4 当想要切换列表中的一个路径时,将每个路径从0到n进行编号

pushd +3 #会将栈进行翻转并切换到3号目录

15.5 删除最后添加的路径

popd命令

15.6 popd +num 可以从列表中移除特定的路径

num是从左到右,从0到n开始计数的。

16、统计文件中的行数,单词数和字符数

统计文件的行数,单词数和字符数。

16.1 统计行数

wc -l file

16.2 统计单词数

wc -w file

16.3 统计字符数

wc -c file

16.4 当不适用选项时

wc file

会分别打印出文件的行数,单词数,字符数、

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

wc file -L

17、打印目录树

tree命令(很多发行版不存在此命令)

2016/12/12 19:26