第二周技术作业
2020-06-22 本文已影响0人
神牧
一、描述Linux发行版的系统目录名称命名规则以及用途。
Linux系统基础目录的命名法则:
遵循FHS(Filesystem Hierarchy Standard)标准
严格区分大小写
目录也是文件,在同一路径下,两个文件不能同名
支持使用除 / 以外的任意字符
最长字符不能超过255个字符
Linux发行版基本目录架构及用途描述 基本目录结构及用途.png
二、描述文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息?
在Linux中,我们可以stat命令查看文件的元数据
[root@centos7 scripts]# stat httpdinstall.sh
File: ‘httpdinstall.sh’
Size: 992 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 8433096 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-06-21 18:17:56.185996379 +0800
Modify: 2020-06-21 18:17:40.853997126 +0800
Change: 2020-06-21 18:17:40.853997126 +0800
Birth: -
其中:
File:文件名
Size:文件大小(单位:byte)
Blocks:文件占用的数据块个数
IO Block:文件所占用数据块的块容量(单位:byte)
regular file:普通文件(文件类型)
Device:设备号(十六进制/十进制)
Inode:索引节点
Links:硬连接数(1代表没有其它的硬连接)
Access:第一个Access,权限(八进制/rwx格式)
Uid:所属主(ID号/名称)
Gid:所属组(ID号/名称)
Access:第二个Access,最近访问时间
Modify:最近数据修改时间
Change:最近元数据修改时间
Birth:创建时间
我们可以用touch命令修改文件的时间戳信息:
需要注意的是Changetime无法指定进行修改,在atime以及mtime修改后,ctime自动进行更新。
-c: 指定的文件路径不存在时不予创建;
-a: 仅修改access time;
-m:仅修改modify time;
-t STAMP
[[CC]YY]MMDDhhmm[.ss]
文件的三个时间戳详细介绍如下:
atime:访问时间:读一次文件的内容,这个时间就会更新。比如more、cat等命令。ls、stat命令不会修改atime
mtime:修改时间:修改时间是文件内容最后一次被修改的时间。比如:vim操作后保存文件。ls -l列出的就是这个时间
ctime:状态改动时间。是该文件的inode节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新。
三、总结软连接和硬连接区别,并用实例操作说明。
硬链接
- 创建硬链接会增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:m命令递减计数的链接
- 文件要存在,至少有一个链接数
- 当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 语法:
ln filename [linkname ]
符号(或软)链接
- 一个符号链接指向另一个文件
- ls - l的 显示链接的名称和引用的文件
- 一个符号链接的内容是它引用文件的名称
- 可以对目录进行
- 可以跨分区
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 语法:
ln -s filename [linkname]
实例:
创建硬链接
可以看到硬链接文件与源文件inode节点号相同,链接数为2,删除源文件后链接数递减,硬链接文件仍可查看打开;创建跨分区硬链接时失败。
[root@centos7 data]# ln 1 1.1
[root@centos7 data]# ll -i 1 1.1
71 -rw-r--r-- 2 root root 16 Jun 22 09:05 1
71 -rw-r--r-- 2 root root 16 Jun 22 09:05 1.1
[root@centos7 data]# rm -rf 1
[root@centos7 data]# cat 1.1
123
123
123
123
[root@centos7 data]# ll -i 1.1
71 -rw-r--r-- 1 root root 16 Jun 22 09:05 1.1
[root@centos7 data]# ln /etc/issue issue
ln: failed to create hard link ‘issue’ => ‘/etc/issue’: Invalid cross-device link
创建软连接
可以看到软链接文件与源文件inode不同,所以是不同文件,与源文件存在映射关系,移动源文件后,软链接文件无法查看。
[root@centos7 data]# ln -s /etc/issue issue.link
[root@centos7 data]# ll -i issue.link
69 lrwxrwxrwx 1 root root 10 Jun 22 08:42 issue.link -> /etc/issue
[root@centos7 data]# ll -i /etc/issue
16798756 -rw-r--r--. 1 root root 43 May 10 21:25 /etc/issue
[root@centos7 data]# mv /etc/issue /etc/issue.bak
[root@centos7 data]# cat issue.link
cat: issue.link: No such file or directory
四、Linux 上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
复制命令—cp
语法
cp [选项] 源文件 目标文件
源文件\目标 不存在 存在且为文件 存在为目录
一个文件 创建dest,并将src填充 覆盖目标文件 在dest新建src同名文件并填充
多个文件 报错 报错 在dest新建src同名文件并填充
目录 -r 创建dest同名目录,src下文件复制其中 报错 在dest新建src同名目录,src下文件复制其中
常用选项
-i 覆盖前提示
-n 不覆盖,注意两者顺序
-r, -R 递归复制目录及内部的所有内容
-a 归档,相当于-dR --preserv=all
-d --no-dereference --preserv=links 不复制原文件,只复制链接名
--preserv[=ATTR_LIST]
mode: 权限
ownership: 属主属组
timestamp:
links
xattr
context
all
-p 等同--preserv=mode,ownership,timestamp
-v --verbose
-f --force
-u --update 只复制源比目标更新文件或目标不存在的文件
-b 目标存在,覆盖前先备份,形式为 filename~
--backup=numbered 目标存在,覆盖前先备份加数字后缀
实例:
创建测试文件
[root@centos7 data]# touch test{1,5}
[root@centos7 data]# vim test1
[root@centos7 data]# cat test1
123
123
复制test1到test2(不存在自动生成)
[root@centos7 data]# cp test1 test2
[root@centos7 data]# cat test2
123
123
创建目录
[root@centos7 data]# mkdir test
复制多个文件到目录
[root@centos7 data]# cp test1 test2 test/
[root@centos7 data]# ll test
total 8
-rw-r--r-- 1 root root 8 Jun 22 11:11 test1
-rw-r--r-- 1 root root 8 Jun 22 11:11 test2
复制test1到test5,将test5内容覆盖
[root@centos7 data]# cp test1 test5
cp: overwrite ‘test5’? y
[root@centos7 data]# cat test5
123
123
复制目录到另一目录
[root@centos7 data]# cp -r scripts/ test
[root@centos7 data]# ll test
total 8
drwxr-xr-x 2 root root 57 Jun 22 11:13 scripts
-rw-r--r-- 1 root root 8 Jun 22 11:11 test1
-rw-r--r-- 1 root root 8 Jun 22 11:11 test2
复制源目录到另一目录(不存在自动创建),将源目录下文件复制至此目录下
[root@centos7 data]# cp -r scripts/ testnodir
[root@centos7 data]# ll testnodir/
total 4
-rw-r--r-- 1 root root 992 Jun 22 11:20 httpdinstall.sh
[root@centos7 data]# ll scripts/
total 4
-rw-r--r-- 1 root root 992 Jun 21 18:17 httpdinstall.sh
复制文件至目录
[root@centos7 data]# cp test5 test
[root@centos7 data]# ll test
total 12
drwxr-xr-x 2 root root 57 Jun 22 11:13 scripts
-rw-r--r-- 1 root root 8 Jun 22 11:11 test1
-rw-r--r-- 1 root root 8 Jun 22 11:11 test2
-rw-r--r-- 1 root root 8 Jun 22 11:13 test5
移动和重命名文件—mv
语法
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-i 交互式
-f 强制
-b 目标存在,覆盖前先备份
实例:
[root@centos7 data]# touch test1 //创建测试文件
[root@centos7 data]# ll
total 4
-rw-r--r-- 1 root root 16 Jun 22 09:05 1.1
drwxr-xr-x 2 root root 57 Jun 21 18:09 scripts
drwxr-xr-x 5 root root 141 Jun 22 09:05 sourcepackage
-rw-r--r-- 1 root root 0 Jun 22 11:24 test1
[root@centos7 data]# mv test1 test123 //重命名
[root@centos7 data]# ll
total 4
-rw-r--r-- 1 root root 16 Jun 22 09:05 1.1
drwxr-xr-x 2 root root 57 Jun 21 18:09 scripts
drwxr-xr-x 5 root root 141 Jun 22 09:05 sourcepackage
-rw-r--r-- 1 root root 0 Jun 22 11:24 test123
[root@centos7 data]# mv test123 /tmp/ //移动文件至目录
[root@centos7 data]# ll /tmp/test123
-rw-r--r-- 1 root root 0 Jun 22 11:24 /tmp/test123
[root@centos7 data]# touch test123 //创建同名文件
[root@centos7 data]# mv -b /tmp/test123 test123 //移动文件覆盖时先备份
mv: overwrite ‘test123’? y
[root@centos7 data]# ll
total 4
-rw-r--r-- 1 root root 16 Jun 22 09:05 1.1
drwxr-xr-x 2 root root 57 Jun 21 18:09 scripts
drwxr-xr-x 5 root root 141 Jun 22 09:05 sourcepackage
-rw-r--r-- 1 root root 0 Jun 22 11:24 test123
-rw-r--r-- 1 root root 0 Jun 22 11:25 test123~ //备份文件
删除命令—rm
语法
rm [OPTION]... FILE...
常用选项
-f, --force 忽略不存在的文件,从不给出提示
-i, --interactive 进行交互式删除
-r, -R, --recursive 指示rm将参数中列出的全部目录和子目录均递归地删除。
-v, --verbose 详细显示进行的步骤
实例:
[root@centos7 data]# ll
total 4
-rw-r--r-- 1 root root 16 Jun 22 09:05 1.1
drwxr-xr-x 2 root root 57 Jun 21 18:09 scripts
drwxr-xr-x 5 root root 141 Jun 22 09:05 sourcepackage
-rw-r--r-- 1 root root 0 Jun 22 11:24 test123
-rw-r--r-- 1 root root 0 Jun 22 11:25 test123~
[root@centos7 data]# rm -f test123 //强制删除无需询问
[root@centos7 data]# rm -i test123~ //删除时需询问确认后删除
rm: remove regular empty file ‘test123~’? y
[root@centos7 data]# ll
total 4
-rw-r--r-- 1 root root 16 Jun 22 09:05 1.1
drwxr-xr-x 2 root root 57 Jun 21 18:09 scripts
drwxr-xr-x 5 root root 141 Jun 22 09:05 sourcepackage
[root@centos7 data]# rm -v 1.1 //显示删除过程
rm: remove regular file ‘1.1’? y
removed ‘1.1’
[root@centos7 data]# mkdir testdir //创建目录
[root@centos7 data]# touch testdir/123 //创建目录下文件
[root@centos7 data]# rm -d testdir/ //删除空目录选项
rm: cannot remove ‘testdir/’: Directory not empty //不是空目录删除失败
[root@centos7 data]# rm -r testdir/ //删除目录及递归子文件
rm: descend into directory ‘testdir/’? y
rm: remove regular empty file ‘testdir/123’? y
rm: remove directory ‘testdir/’? y
[root@centos7 data]# ll
total 0
drwxr-xr-x 2 root root 57 Jun 21 18:09 scripts
drwxr-xr-x 5 root root 141 Jun 22 09:05 sourcepackage
五、复制/etc/profile至/tmp/日录, 用查找替换命令删除/tmp/profile文件中的行首的空白字符
[root@centos7 data]# mv /etc/profile /data/
[root@centos7 data]# cat profile //查看原内容
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
查看修改后
[root@CentOS7 data]#vim profile
:%s/^[[:space:]]\+//
[root@centos7 data]# cat profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge