在Linux系统中,对文件的常规操作是我们每天必做的工作,包括归档/压缩文件和目录、设置文件属性以及在文件系统上查找文件等。为此,在本文中,小编将详细介绍与Linux文件操作的基本内容。
这些命令涵盖了在Linux系统中进行文件操作的一些基本需求,包括归档压缩、权限设置和搜索查找。你可以根据具体的任务需求来使用这些命令。当然,也可也查阅命令的手册页以获取更多详细信息。
适用于Linux的归档和压缩工具
文件归档工具将一组文件分组为一个独立文件,可以将其备份到多种类型的媒体、通过网络传输或通过电子邮件发送。Linux中最常用的归档实用程序是tar命令。当归档实用程序与压缩工具一起使用时,它可以减少存储相同文件和信息所需的磁盘大小。
Linux tar实用程序
tar将一组文件捆绑到一个存档中(通常称为tar文件或tarball)。该名称最初代表磁带归档器,但必须注意,我们可以使用此工具将数据归档到任何类型的可写介质(不仅仅是磁带)。Tar通常与gzip、bzip2或xz等压缩工具一起使用来生成压缩的tarball。
tar命令的基本语法如下:
# tar [options] [pathname ...]
其中...
表示用于指定应对哪些文件执行操作的表达式。
最常用的Tar命令:
全称 | 缩写 | 功能描述 |
–create | C | 创建tar存档 |
–concatenate | A | 将tar文件附加到存档 |
–append | r | 将文件附加到存档的末尾 |
–update | u | 追加比存档中的副本更新的文件 |
–diff or –compare | d | 查找存档和文件系统之间的差异 |
–file archive | F | 使用归档文件或设备ARCHIVE |
–list | t | 列出tarball内容 |
–extract or –get | X | 从存档中提取文件 |
常用的tar操作修饰符:
全称 | 缩写 | 功能描述 |
–directory dir | C | 在执行操作之前更改目录dir |
–same-permissions | p | 保留原始权限 |
–verbose | v | 列出所有读取或提取的文件,当此标志与–list一起使用时,将显示文件大小、所有权和时间戳。 |
–verify | W | 写入后验证存档 |
–exclude file | — | 从存档中排除文件 |
–exclude=pattern | X | 排除文件,以PATTERN形式给出 |
–gzip or –gunzip | z | 通过Gzip处理存档 |
–bzip2 | j | 通过bzip2处理存档 |
–xz | J | 通过xz处理存档 |
Linux Gzip、Bzip2和Xz实用程序
Gzip是最古老的压缩工具,提供最少的压缩,而bzip2提供改进的压缩。此外,xz是最新的,但(通常)提供最好的压缩。当然,最佳压缩的优点是有代价的:完成操作所需的时间以及在此过程中使用的系统资源。
通常情况下,使用这些实用程序压缩的tar文件分别具有.gz
、.bz2
、 或.xz
扩展名。在以下示例中,将使用这些文件:file1、file2、file3、file4和file5。
使用gzip、bzip2和xz压缩文件
将当前工作目录中的所有文件分组,并使用gzip、bzip2和xz压缩生成的包(请注意使用正则表达式来指定包中应包含哪些文件,这是为了防止归档工具对之前步骤中创建的tarball进行分组)。
# tar czf myfiles.tar.gz file[0-9] # tar cjf myfiles.tar.bz2 file[0-9] # tar cjf myfile.tar.xz file[0-9]
列出内容并更新/附加文件Tar存档
列出tarball的内容,并显示与长目录列表相同的信息。请注意,更新或追加操作不能直接应用于压缩文件。
1、解压缩Tar文件
如果需要更新或附加文件到压缩的tarball,则需要解压缩tar文件并更新/附加到它,然后再次压缩它:
# tar tvf [tarball]
然后运行以下任意命令:
# gzip -d myfiles.tar.gz [#1] # bzip2 -d myfiles.tar.bz2 [#2] # xz -d myfiles.tar.xz [#3]
2、删除文件或将文件添加到Tar存档
# tar --delete --file myfiles.tar file4 (删除tarball中的文件) # tar --update --file myfiles.tar file4 (添加更新的文件)
继续输入:
# gzip myfiles.tar [如果选择上面的#1] # bzip2 myfiles.tar [如果选择上面的#2] # xz myfiles.tar [如果选择上面的#3]
最后输入以下命令解压:
# tar tvf [tarball]
这时将file4的修改日期和时间与之前显示的信息进行比较,可以看出已经更新了。
从备份中排除文件
假设要执行用户主目录的备份。一个好的系统管理员经验是(也可能由公司政策指定)从备份中排除所有视频和音频文件。
也许你的第一种方法是从备份中排除所有具有.mp3
或.mp4
扩展名(或其它扩展名)的文件。如果有其它用户将扩展名更改为.txt
或.bkp
,那么你的这种方法可能就行不通。
所以,为了检测音频或视频文件,需要使用文件检查其文件类型。下面的shell脚本将完成这项工作:
#!/bin/bash # Pass the directory to backup as first argument. DIR=$1 # Create the tarball and compress it. Exclude files with the MPEG string in its file type. # -If the file type contains the string mpeg, $? (the exit status of the most recently executed command) expands to 0, and the filename is redirected to the exclude option. Otherwise, it expands to 1. # -If $? equals 0, add the file to the list of files to be backed up. tar X <(for i in $DIR/*; do file $i | grep -i mpeg; if [ $? -eq 0 ]; then echo $i; fi;done) -cjf backupfile.tar.bz2 $DIR/*
使用Tar保留权限恢复备份
可以使用以下命令将备份还原到原始用户的主目录(本例中为user_restore),并保留权限:
# tar xjf backupfile.tar.bz2 --directory user_restore --same-permissions
使用Find命令搜索文件
find命令用于在目录树中递归搜索匹配某些特征的文件或目录,然后可以打印匹配的文件或目录或对匹配项执行其它操作。通常,我们会按名称、所有者、组、类型、权限、日期和大小进行搜索。
find命令的基本语法如下:
# find [directory_to_search] [expression]
根据大小递归查找文件
查找(-f)当前目录(.)和下面两个子目录(-maxdeep 3表示当前工作目录和下面两个层数)中大小(-size)大于2MB的所有文件,命令如下:
# find . -maxdepth 3 -type f -size +2M
查找并删除符合特定条件的文件
具有777权限的文件有时被视为对外部攻击者敞开大门。无论哪种方式,让任何人对文件进行任何操作都是不安全的。一般会采取比较激进的做法,将其删除!(“ {}
”+
用于“集合”搜索结果)。
# find /home/user -perm 777 -exec rm '{}' +
根据时间戳查找文件
在/etc中搜索访问(-atime)或修改(-mtime)超过(+180)或少于(-180)6个月或正好6个月前(180)的配置文件。按照下面的示例修改以下命令:
# find /etc -iname "*.conf" -mtime -180 -print
设置文件权限和基本属性
ls -l输出中的前10个字符是文件属性,这些字符中的第一个用于指示文件类型:
-
: 普通文件-d
: 目录-l
: 符号链接-c
:字符设备(将数据视为字节流,即终端)-b
:块设备(处理块中的数据,即存储设备)
文件属性的下九个字符称为文件模式,表示文件所有者、文件组所有者和其它用户(通常为“world”)的读取(r)、写入(w)和执行(x)权限。
文件的读取权限允许打开和读取该文件,而如果还设置了执行权限,则目录的相同权限允许列出其内容。此外,文件中的执行权限允许将其作为程序处理并运行,而在目录中则允许将其cd到其中。
文件权限通过chmod命令更改,其基本语法如下:
# chmod [new_mode] file
其中new_mode是八进制数或指定新权限的表达式。八进制数可以从其二进制等效值转换而来,二进制等效值是根据所有者、组和world所需的文件权限计算出来的,具体如下所示。
另外,某些权限的存在等于2的幂(r=22、w=21、x=20),而不存在则等于0。例如:
要以八进制形式设置上述文件的权限,请键入以下命令:
# chmod 744 myfile
此外,你还可以使用表达式设置文件的模式,该表达式用字母u
表示所有者的权限,用字母g
表示组所有者的权限,用o
表示其余权限。
所有这些“个体用户”都可以同时用字母a
代表。权限分别用+或-符号授予(或撤销)。
删除所有用户对脚本的执行权限
正如之前解释的,可以通过在某个权限前面加上减号来撤销某个权限,并指示是否需要为所有者、组所有者或所有用户撤销该权限。下面一行可以解释如下:更改所有(a
)用户的模式,撤销(-
)执行权限(x
)。
# chmod a-x backup.sh
- 所有者:(r=22+w=21+x=20=7)
- 群组所有者:(r=22+w=21+ x=20=7)
- World:(r=22+w=0+x=0= 4)
# chmod 774 myfile
随着时间的推移,通过学习之后,你将能够决定在每种情况下哪种更改文件模式的方法最适合你。以下长目录列表还显示文件的所有者及其组所有者(作为对系统中文件的基本但有效的访问控制):
使用chown命令更改文件所有权。所有者和群组所有者可以同时或单独更改。其基本语法如下:
# chown user:group file
其中至少需要一个用户或组。
chown命令示例
将文件的所有者更改为特定用户,命令如下:
# chown gacanepa sent
将文件的拥有者改为另一个指定的用户或组:
# chown gacanepa:gacanepa TestFile
仅将文件的组所有者更改为特定组,请注意组名称前面的冒号。
# chown :gacanepa email_body.txt
总结
以上这些是一些最常见的Linux文件操作命令,但还有许多其它命令和选项可用于更复杂的文件操作任务,这里就不多做介绍了。作为Linux系统管理员,最起码需要知道如何创建和恢复备份,如何查找系统中的文件并更改其属性,这样才能更好的使用和管理Linux系统。