网页设计素材网站推荐,建站网站有哪些,彩票交易网站开发,宁波网站建设推广公司【BASH】回顾与知识点梳理 十二 十二. Linux 文件与目录管理12.1 目录与路径相对路径与绝对路径相对路径的用途绝对路径的用途 12.2 目录的相关操作cd (change directory, 变换目录)pwd (Print Working Directory, 显示目前所在的目录)mkdir (make directory, 建立新目录)rmdir… 【BASH】回顾与知识点梳理 十二 十二. Linux 文件与目录管理12.1 目录与路径相对路径与绝对路径相对路径的用途绝对路径的用途 12.2 目录的相关操作cd (change directory, 变换目录)pwd (Print Working Directory, 显示目前所在的目录)mkdir (make directory, 建立新目录)rmdir (remove directory, 删除『空』的目录) 12.3 关于执行文件路径的变量 $PATH12.4 文件与目录的检视 ls12.5 复制、删除与移动 cp, rm, mv, renamecp (复制文件或目录)rm (移除文件或目录)mv (移动文件与目录或更名)rename(用字符串替换的方式批量改变文件名) 12.6 取得路径的文件名与目录名称dirname, basename 该系列目录 -- 【BASH】回顾与知识点梳理目录
有小伙伴私信说鸟哥《私房菜》的第六章也有很多命令笔者看了下确实是这样包括很多文件和目录相关的命令毕竟linux一切皆文件还是有必要进行梳理的所以本章和下章都将从鸟哥《私房菜》的第六章摘取内容
十二. Linux 文件与目录管理
在这个章节当中我们就直接来进一步的操作与管理文件及目录吧包括在不同的目录间变换、 建立与删除目录、建立与删除文件还有寻找文件、查阅文件内容等等都会在这个章节作个简单的介绍啊
12.1 目录与路径
相对路径与绝对路径
在开始目录的切换之前你必须要先了解一下所谓的『路径(PATH)』 有趣的是什么是『相对路径』与『绝对路径』
绝对路径路径的写法『一定由根目录 / 写起』例如 /usr/share/doc 这个目录。相对路径路径的写法『不是由 / 写起』例如由 /usr/share/doc 要到 /usr/share/man 底下时可以写成『cd …/man』这就是相对路径的写法啦相对路径意指『相对于目前工作目录的路径』
相对路径的用途
那么相对路径与绝对路径有什么了不起呀喝那可真的是了不起了假设你写了一个软件 这个软件共需要三个目录分别是 etc, bin, man 这三个目录然而由于不同的人喜欢安装在不同的目录之下假设甲安装的目录是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man 不过乙却喜欢安装在 /home/packages/etc, /home/packages/bin, /home/packages/man 这三个目录中请问如果需要用到绝对路径的话那么是否很麻烦呢是的 如此一来每个目录下的东西就很难对应的起来这个时候相对路径的写法就显的特别的重要了
此外如果你跟鸟哥一样喜欢将路径的名字写的很长好让自己知道那个目录是在干什么的例如/cluster/raid/output/taiwan2006/smoke 这个目录而另一个目录在 /cluster/raid/output/taiwan2006/cctm 那么我从第一个要到第二个目录去的话怎么写比较方便 当然是『 cd …/cctm 』比较方便啰对吧
绝对路径的用途
但是对于档名的正确性来说『绝对路径的正确度要比较好』。 一般来说鸟哥会建议你如果是在写程序 (shell scripts) 来管理系统的条件下务必使用绝对路径的写法。 怎么说呢因为绝对路径的写法虽然比较麻烦但是可以肯定这个写法绝对不会有问题。 如果使用相对路径在程序当中则可能由于你执行的工作环境不同导致一些问题的发生。
12.2 目录的相关操作
我们之前稍微提到变换目录的指令是 cd还有哪些可以进行目录操作的指令呢 例如建立目录啊、删除目录之类的还有得要先知道的就是有哪些比较特殊的目录呢 举例来说底下这些就是比较特殊的目录得要用力的记下来才行
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表『目前用户身份』所在的家目录
~account 代表 account 这个用户的家目录(account 是个账号名称)需要特别注意的是在所有目录底下都会存在的两个目录分别是『.』与『..』 分别代表此层与上层目录的意思。 那么来思考一下底下这个例题我们知道所有目录都是从根目录开始的那么请问在 Linux 底下根目录(/)下有没有上层目录(..)存在 答 若使用『 ls -al / 』去查询可以看到根目录下确实存在 . 与..两个目录再仔细的查阅 可发现这两个目录的属性与权限完全一致这代表根目录的上一层(..)与根目录自己(.)是同一个目录。 底下我们就来谈一谈几个常见的处理目录的指令吧
cd变换目录pwd显示当前目录mkdir建立一个新的目录rmdir删除一个空的目录
cd (change directory, 变换目录)
[dmtsaistudy ~]$ su - # 先切换身份成为 root 看看
[rootstudy ~]# cd [相对路径或绝对路径]
# 最重要的就是目录的绝对路径与相对路径还有一些特殊目录的符号啰
[rootstudy ~]# cd ~dmtsai
# 代表去到 dmtsai 这个用户的家目录亦即 /home/dmtsai
[rootstudy dmtsai]# cd ~
# 表示回到自己的家目录亦即是 /root 这个目录
[rootstudy ~]# cd
# 没有加上任何路径也还是代表回到自己家目录的意思喔
[rootstudy ~]# cd ..
# 表示去到目前的上层目录亦即是 /root 的上层目录的意思
[rootstudy /]# cd -
# 表示回到刚刚的那个目录也就是 /root 啰
[rootstudy ~]# cd /var/spool/mail
# 这个就是绝对路径的写法直接指定要去的完整路径名称
[rootstudy mail]# cd ../postfix
# 这个是相对路径的写法我们由/var/spool/mail 去到/var/spool/postfix 就这样写我们的提示字符亦即那个 [rootstudy ~]# 当中就已经有指出当前目录了 刚登入时会到自己的家目录而家目录还有一个代码那就是『 ~ 』符号 例如上面的例子可以发现使用『 cd ~ 』可以回到个人的家目录里头去呢 另外针对 cd 的使用方法如果仅输入 cd 时代表的就是『 cd ~ 』的意思喔 亦即是会回到自己的家目录啦而那个『 cd - 』比较难以理解请自行多做几次练习就会比较明白了。
pwd (Print Working Directory, 显示目前所在的目录)
[rootstudy ~]# pwd [-P]
选项与参数
-P 显示出确实的路径而非使用链接 (link) 路径。#范例单纯显示出目前的工作目录
[rootstudy ~]# pwd
/root 显示出目录啦#范例显示出实际的工作目录而非链接文件本身的目录名而已
[rootstudy ~]# cd /var/mail 注意/var/mail 是一个连结档
[rootstudy mail]# pwd
/var/mail 列出目前的工作目录
[rootstudy mail]# pwd -P
/var/spool/mail 怎么回事有没有加 -P 差很多
[rootstudy mail]# ls -ld /var/mail
lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail - spool/mail
# 看到这里应该知道为啥了吧因为 /var/mail 是连结档连结到 /var/spool/mail
# 所以加上 pwd -P 的选项后会不以连结文件的数据显示而是显示正确的完整路径啊mkdir (make directory, 建立新目录)
[rootstudy ~]# mkdir [-mp] 目录名称
选项与参数
-m 配置文件案的权限喔直接设定不需要看预设权限 (umask) 的脸色
-p 帮助你直接将所需要的目录(包含上层目录)递归建立起来#范例请到/tmp 底下尝试建立数个新目录看看
[rootstudy ~]# cd /tmp
[rootstudy tmp]# mkdir test 建立一名为 test 的新目录
[rootstudy tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
# 话说系统告诉我们没可能建立这个目录啊就是没有目录才要建立的见鬼嘛
[rootstudy tmp]# mkdir -p test1/test2/test3/test4
# 原来是要建 test4 上层没先建 test3 之故加了这个 -p 的选项可以自行帮你建立多层目录#范例建立权限为 rwx--x--x 的目录
[rootstudy tmp]# mkdir -m 711 test2
[rootstudy tmp]# ls -ld test*
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 仔细看上面的权限部分如果没有加上 -m 来强制设定属性系统会使用默认属性。
# 那么你的默认属性为何777 022 755 这要透过底下介绍的 umask 才能了解喔 ^_^我们可以利用 -m 来强制给予一个新的目录相关的权限 例如上表当中我们给予 -m 711 来给予新的目录 drwx–x–x 的权限。不过如果没有给予 -m 选项时 那么默认的新建目录权限又是什么呢这个跟 umask 有关我们在本章后头会加以介绍的。
rmdir (remove directory, 删除『空』的目录)
[rootstudy ~]# rmdir [-p] 目录名称
选项与参数
-p 连同『上层』『空的』目录也一起删除#范例将于 mkdir 范例中建立的目录(/tmp 底下)删除掉
[rootstudy tmp]# ls -ld test* 看看有多少目录存在
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
[rootstudy tmp]# rmdir test 可直接删除掉没问题
[rootstudy tmp]# rmdir test1 因为尚有内容所以无法删除
rmdir: failed to remove ‘test1’: Directory not empty
[rootstudy tmp]# rmdir -p test1/test2/test3/test4
[rootstudy tmp]# ls -ld test* 您看看底下的输出中 test 与 test1 不见了
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 瞧利用 -p 这个选项立刻就可以将 test1/test2/test3/test4 一次删除
# 不过要注意的是这个 rmdir 仅能『删除空的目录』喔12.3 关于执行文件路径的变量 $PATH
我们知道查阅文件属性的指令 ls 完整文件名为/bin/ls(这是绝对路径)那你会不会觉得很奇怪『为什么我可以在任何地方执行/bin/ls 这个指令呢 』 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢 这是因为环境变量PATH 的帮助所致呀
当我们在执行一个指令的时候举例来说『ls』好了系统会依照 PATH 的设定去每个 PATH 定义的目录下搜寻文件名为 ls 的可执行文件如果在 PATH 定义的目录中含有多个文件名为 ls 的可执行文件那么先搜寻到的同名指令先被执行
# 范例先用 root 的身份列出搜寻的路径为何
[rootstudy ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin# 范例用 dmtsai 的身份列出搜寻的路径为何
[rootstudy ~]# exit # 由之前的 su - 离开变回原本的账号或再取得一个终端机皆可
[dmtsaistudy ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
# 记不记得我们前一章说过目前 /bin 是连结到 /usr/bin 当中的喔
[rootnode-135 test2]# ll /bin
lrwxrwxrwx. 1 root root 7 Jul 14 17:27 /bin - usr/binPATH(一定是大写)这个变量的内容是由一堆目录所组成的每个目录中间用冒号(:)来隔开 每个目录是有『顺序』之分的。
我们用几个范例来让你了解一下为什么 PATH 是那么重要的项目
例题 假设你是 root如果你将 ls 由/bin/ls 移动成为/root/ls(可用『mv /bin/ls /root』指令达成)然后你自己本身也在/root目录下 请问 (1)你能不能直接输入 ls 来执行 (2)若不能你该如何执行 ls 这个指令 (3)若要直接输入 ls 即可执行又该如何进行 答 由于这个例题的重点是将某个执行文件移动到非正规目录去所以我们先要进行底下的动作才行(务必先使用 su - 切换成为 root 的身份 [rootstudy ~]# mv /bin/ls /root
# mv 为移动可将文件在不同的目录间进行移动作业(1)接下来不论你在那个目录底下输入任何与 ls 相关的指令都没有办法顺利的执行 ls 了 也就是说你不能直接输入 ls 来执行因为/root 这个目录并不在 PATH 指定的目录中 所以即使你在/root 目录下也不能够搜寻到 ls这个指令(2)因为这个 ls 确实存在于/root 底下并不是被删除了所以我们可以透过使用绝对路径或者是相对路径直接指定这个执行档档名 底下的两个方法都能够执行 ls 这个指令 [rootstudy ~]# /root/ls 直接用绝对路径指定该文件名
[rootstudy ~]# ./ls 因为在 /root 目录下就用./ls 来指定(3)如果想要让 root 在任何目录均可执行/root 底下的 ls那么就将/root 加入 PATH 当中即可。 加入的方法很简单就像底下这样 [rootstudy ~]# PATH${PATH}:/root某些情况下即使你已经将 ls 搬回 /bin 了不过系统还是会告知你无法处理 /root/ls 喔很可能是因为指令参数被快取的关系。 不要紧张只要注销 (exit) 再登入 (su -) 就可以继续快乐的使用 ls 了 例题 如果我有两个 ls 指令在不同的目录中例如/usr/local/bin/ls 与/bin/ls 那么当我下达 ls 的时候哪个 ls 会被执行 答 那还用说就找出 ${PATH} 里面哪个目录先被查询则那个目录下的指令就会被先执行了所以用 dmtsai 账号为例他最先搜寻的是 /usr/local/bin 所以 /usr/local/bin/ls 会先被执行喔 例题 为什么 ${PATH} 搜寻的目录不加入本目录(.) 加入本目录的搜寻不是也不错 答 如果在 PATH 中加入本目录(.)后确实我们就能够在指令所在目录进行指令的执行了。 但是由于你的工作目录并非固定(常常会使用 cd 来切换到不同的目录)因此能够执行的指令会有变动(因为每个目录底下的可执行文件都不相同嘛)这对使用者来说并非好事。 另外如果有个坏心使用者在/tmp 底下做了一个指令因为/tmp 是大家都能够写入的环境所以他当然可以这样做。 假设该指令可能会窃取用户的一些数据如果你使用 root 的身份来执行这个指令那不是很糟糕 如果这个指令的名称又是经常会被用到的 ls 时那『中标』的机率就更高了 所以为了安全起见不建议将『.』加入 PATH 的搜寻目录中。
而由上面的几个例题我们也可以知道几件事情 不同身份使用者预设的 PATH 不同默认能够随意执行的指令也不同(如 root 与 dmtsai)PATH 是可以修改的使用绝对路径或相对路径直接指定某个指令的文件名来执行会比搜寻 PATH 来的正确指令应该要放置到正确的目录下执行才会比较方便本目录(.)最好不要放到 PATH 当中。 12.4 文件与目录的检视 ls
[rootstudy ~]# ls [-aAdfFhilnrRSt] 文件名或目录名称..
[rootstudy ~]# ls [--color{never,auto,always}] 文件名或目录名称..
[rootstudy ~]# ls [--full-time] 文件名或目录名称..
选项与参数
-a 全部的文件连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
-A 全部的文件连同隐藏档但不包括 . 与 .. 这两个目录
-d 仅列出目录本身而不是列出目录内的文件数据(常用)
-f 直接列出结果而不进行排序 (ls 预设会以档名排序)
-F 根据文件、目录等信息给予附加数据结构例如*:代表可执行文件 /:代表目录 :代表 socket 文件 |:代表 FIFO 文件
-h 将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来
-i 列出 inode 号码inode 的意义下一章将会介绍
-l 长数据串行出包含文件的属性与权限等等数据(常用)
-n 列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到)
-r 将排序结果反向输出例如原本档名由小到大反向则为由大到小
-R 连同子目录内容一起列出来等于该目录下的所有文件都会显示出来
-S 以文件容量大小排序而不是用档名排序
-t 依时间排序而不是用档名。
--colornever 不要依据文件特性给予颜色显示
--coloralways 显示颜色
--colorauto 让系统自行依据设定来判断是否给予颜色
--full-time 以完整时间模式 (包含年、月、日、时、分) 输出
--time{atime,ctime} 输出 access 时间或改变权限属性时间 (ctime) 而非内容变更时间 (modification time)当你只有下达 ls 时默认显示的只有非隐藏档的档名、 以档名进行排序及文件名代表的颜色显示如此而已。
12.5 复制、删除与移动 cp, rm, mv, rename
要复制文件请使用 cp (copy) 这个指令即可不过 cp 这个指令的用途可多了 除了单纯的复制之外还可以建立连结档 (就是快捷方式啰)比对两文件的新旧而予以更新 以及复制整个目录等等的功能呢至于移动目录与文件则使用 mv (move) 这个指令也可以直接拿来作更名 (rename) 的动作喔至于移除吗那就是 rm (remove) 这个指令啰底下我们就来瞧一瞧先
cp (复制文件或目录)
[rootstudy ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination)
[rootstudy ~]# cp [options] source1 source2 source3 .... directory
选项与参数
-a 相当于 -dr --preserveall 的意思至于 dr 请参考下列说明(常用)
-d 若来源文件为链接文件的属性(link file)则复制链接文件属性而非文件本身
-f 为强制(force)的意思若目标文件已经存在且无法开启则移除后再尝试一次
-i 若目标文件(destination)已经存在时在覆盖时会先询问动作的进行(常用)
-l 进行硬式连结(hard link)的连结档建立而非复制文件本身
-p 连同文件的属性(权限、用户、时间)一起复制过去而非使用默认属性(备份常用)
-r 递归持续复制用于目录的复制行为(常用)
-s 复制成为符号链接文件 (symbolic link)亦即『快捷方式』文件
-u destination 比 source 旧才更新 destination或 destination 不存在的情况下才复制。
--preserveall 除了 -p 的权限相关参数外还加入 SELinux 的属性, links, xattr 等也复制了。最后需要注意的如果来源档有两个以上则最后一个目的文件一定要是『目录』才行复制(cp)这个指令是非常重要的不同身份者执行这个指令会有不同的结果产生尤其是那个-a, -p 的选项 对于不同身份来说差异则非常的大底下的练习中有的身份为 root 有的身份为一般账号(在我这里用 dmtsai 这个账号)练习时请特别注意身份的差别喔好开始来做复制的练习与观察
# 范例一用 root 身份将家目录下的 .bashrc 复制到 /tmp 下并更名为 bashrc
[rootstudy ~]# cp ~/.bashrc /tmp/bashrc
[rootstudy ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite /tmp/bashrc? n n 不覆盖y 为覆盖
# 重复作两次动作由于 /tmp 底下已经存在 bashrc 了加上 -i 选项后
# 则在覆盖前会询问使用者是否确定可以按下 n 或者 y 来二次确认呢# 范例二变换目录到/tmp并将/var/log/wtmp 复制到/tmp 且观察属性
[rootstudy ~]# cd /tmp
[rootstudy tmp]# cp /var/log/wtmp . 想要复制到当前目录最后的 . 不要忘
[rootstudy tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-r--r--. 1 root root 28416 Jun 11 19:01 wtmp
# 注意上面的特殊字体在不加任何选项的情况下文件的某些属性/权限会改变
# 这是个很重要的特性要注意喔还有连文件建立的时间也不一样了
# 那如果你想要将文件的所有特性都一起复制过来该怎办可以加上 -a 喔如下所示
[rootstudy tmp]# cp -a /var/log/wtmp wtmp_2
[rootstudy tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2
# 瞭了吧整个资料特性完全一模一样ㄟ真是不赖这就是 -a 的特性这个 cp 的功能很多由于我们常常会进行一些数据的复制所以也会常常用到这个指令的。 一般来说我们如果去复制别人的数据 (当然该文件你必须要有 read 的权限才行啊) 时 总是希望复制到的数据最后是我们自己的所以在预设的条件中 cp 的来源档与目的档的权限是不同的目的档的拥有者通常会是指令操作者本身。举例来说 上面的范例二中由于我是 root 的身份因此复制过来的文件拥有者与群组就改变成为 root 所有了 这样说可以明白吗
由于具有这个特性**因此当我们在进行备份的时候某些需要特别注意的特殊权限文件** 例如密码文件 (/etc/shadow) 以及一些配置文件就不能直接以 cp 来复制而必须要加上-a或者是-p等等可以完整复制文件权限的选项才行另外如果你想要复制文件给其他的使用者 也必须要注意到文件的权限(包含读、写、执行以及文件拥有者等等) 否则其他人还是无法针对你给予的文件进行修订的动作喔注意注意
#范例三复制 /etc/ 这个目录下的所有内容到 /tmp 底下
[rootstudy tmp]# cp /etc/ /tmp
cp: omitting directory /etc 如果是目录则不能直接复制要加上 -r 的选项
[rootstudy tmp]# cp -r /etc/ /tmp
# 还是要再次的强调喔 -r 是可以复制目录但是文件与目录的权限可能会被改变
# 所以也可以利用『 cp -a /etc /tmp 』来下达指令喔尤其是在备份的情况下#范例四将范例一复制的 bashrc 建立一个连结档 (symbolic link)
[rootstudy tmp]# ls -l bashrc
-rw-r--r--. 1 root root 176 Jun 11 19:01 bashrc 先观察一下文件情况
[rootstudy tmp]# cp -s bashrc bashrc_slink
[rootstudy tmp]# cp -l bashrc bashrc_hlink
[rootstudy tmp]# ls -l bashrc*
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc 与源文件不太一样了
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc_hlink
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink - bashrc范例四可有趣了使用 -l 及 -s 都会建立所谓的连结档(link file)但是这两种连结档却有不一样的情况。这是怎么一回事啊 那个 -l 就是所谓的实体链接(hard link)至于 -s 则是符号链接(symbolic link) 简单来说bashrc_slink 是一个『快捷方式』这个快捷方式会连结到bashrc 去所以你会看到档名右侧会有个指向(-)的符号至于 bashrc_hlink 文件与 bashrc 的属性与权限完全一模一样与尚未进行连结前的差异则是第二栏的link 数由 1 变成 2 了
# 范例五若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[rootstudy tmp]# cp -u ~/.bashrc /tmp/bashrc
# 这个 -u 的特性是在目标文件与来源文件有差异时才会复制的。
# 所以比较常被用于『备份』的工作当中喔 ^_^# 范例六将范例四造成的 bashrc_slink 复制成为 bashrc_slink_1 与 bashrc_slink_2
[rootstudy tmp]# cp bashrc_slink bashrc_slink_1
[rootstudy tmp]# cp -d bashrc_slink bashrc_slink_2
[rootstudy tmp]# ls -l bashrc bashrc_slink*
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink - bashrc
-rw-r--r--. 1 root root 176 Jun 11 19:09 bashrc_slink_1 与源文件相同
lrwxrwxrwx. 1 root root 6 Jun 11 19:10 bashrc_slink_2 - bashrc 是连结档
# 这个例子也是很有趣喔原本复制的是连结档但是却将连结档的实际文件复制过来了
# 也就是说如果没有加上任何选项时cp 复制的是源文件而非链接文件的属性
# 若要复制链接文件的属性就得要使用 -d 的选项了如 bashrc_slink_2 所示。# 范例七将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下
[rootstudy tmp]# cp ~/.bashrc ~/.bash_history /tmp
# 可以将多个数据一次复制到同一个目录去最后面一定是目录# 范例八你能否使用 dmtsai 的身份完整的复制/var/log/wtmp 文件到/tmp 底下并更名为 dmtsai_wtmp 呢
[dmtsaistudy ~]$ cp -a /var/log/wtmp /tmp/dmtsai_wtmp
[dmtsaistudy ~]$ ls -l /var/log/wtmp /tmp/dmtsai_wtmp
-rw-rw-r--. 1 dmtsai dmtsai 28416 6 月 11 18:56 /tmp/dmtsai_wtmp
-rw-rw-r--. 1 root utmp 28416 6 月 11 18:56 /var/log/wtmp
# 由于 dmtsai 的身份并不能随意修改文件的拥有者与群组因此虽然能够复制 wtmp 的相关权限与时间等属性
# 但是是与拥有者、群组相关的原本 dmtsai 身份无法进行的动作即使加上 -a 选项也是无法达成完整复制权限的总之由于 cp 有种种的文件属性与权限的特性所以在复制时你必须要清楚的了解到
是否需要完整的保留来源文件的信息 -a?来源文件是否为连结档 (symbolic link file) -d?复制链接本身 -s?创建符号连接 -l?硬链接来源档是否为特殊的文件例如 FIFO, socket 等 -a来源文件是否为目录 -r
rm (移除文件或目录)
[rootstudy ~]# rm [-fir] 文件或目录
选项与参数
-f 就是 force 的意思忽略不存在的文件不会出现警告讯息
-i 互动模式在删除前会询问使用者是否动作
-r 递归删除啊最常用在目录的删除了这是非常危险的选项# 范例一将刚刚在 cp 的范例中建立的 bashrc 删除掉
[rootstudy ~]# cd /tmp
[rootstudy tmp]# rm -i bashrc
#rm: remove regular file bashrc? y
# 如果加上 -i 的选项就会主动询问喔避免你删除到错误的档名# 范例二透过通配符*的帮忙将/tmp 底下开头为 bashrc 的档名通通删除
[rootstudy tmp]# rm -i bashrc*
# 注意那个星号代表的是 0 到无穷多个任意字符喔很好用的东西# 范例三将 cp 范例中所建立的 /tmp/etc/ 这个目录删除掉
[rootstudy tmp]# rmdir /tmp/etc
rmdir: failed to remove /tmp/etc: Directory not empty 删不掉啊因为这不是空的目录
[rootstudy tmp]# rm -r /tmp/etc
rm: descend into directory /tmp/etc? y
rm: remove regular file /tmp/etc/fstab? y
rm: remove regular empty file /tmp/etc/crypttab? ^C 按下 [crtl]c 中断
.....(中间省略).....
# 因为身份是 root 预设已经加入了 -i 的选项所以你要一直按 y 才会删除
# 如果不想要继续按 y 可以按下『 [ctrl]-c 』来结束 rm 的工作。
# 这是一种保护的动作如果确定要删除掉此目录而不要询问可以这样做
[rootstudy tmp]# \rm -r /tmp/etc
# 在指令前加上反斜杠可以忽略掉 alias 的指定选项喔
# 拜托这个范例很可怕你不要删错了删除 /etc 系统是会挂掉的# 范例四删除一个带有 - 开头的文件
[rootstudy tmp]# touch ./-aaa- touch 这个指令可以建立空文件
[rootstudy tmp]# ls -l
-rw-r--r--. 1 root root 0 Jun 11 19:22 -aaa- 文件大小为 0所以是空文件
[rootstudy tmp]# rm -aaa-
rm: invalid option -- a 因为 - 是选项嘛所以系统误判了
Try rm ./-aaa- to remove the file -aaa-. 新的 bash 有给建议的
Try rm --help for more information.
[rootstudy tmp]# rm ./-aaa在指令前加上反斜杠可以忽略掉 alias 的指定选项喔\rm -r /tmp/etc 删除一个带有 - 开头的文件 rm ./-aaa 这是移除的指令(remove)要注意的是通常在 Linux 系统下为了怕文件被 root 误杀所以很多distributions 都已经默认加入 -i 这个选项了而如果要连目录下的东西都一起杀掉的话 例如子目录里面还有子目录时那就要使用 -r 这个选项了不过使用『 rm -r 』这个指令之前请千万注意了因为该目录或文件『肯定』会被 root 杀掉因为系统不会再次询问你是否要砍掉呦所以那是个超级严重的指令下达呦 得特别注意不过如果你确定该目录不要了那么使用 rm -r 来循环杀掉是不错的方式
另外范例四也是很有趣的例子我们在之前就谈过档名最好不要使用 “-” 号开头 因为 “-” 后面接的是选项因此单纯的使用『 rm -aaa- 』系统的指令就会误判啦 那如果使用后面会谈到的正规表示法时还是会出问题的所以只能用避过首位字符是 “-” 的方法啦就是加上本目录『./』即可如果 man rm 的话其实还有一种方法那就是『 rm -- -aaa- 』也可以啊
mv (移动文件与目录或更名)
[rootstudy ~]# mv [-fiu] source destination
[rootstudy ~]# mv [options] source1 source2 source3 .... directory
选项与参数
-f force 强制的意思如果目标文件已经存在不会询问而直接覆盖
-i 若目标文件 (destination) 已经存在时就会询问是否覆盖
-u 若目标文件已经存在且 source 比较新才会更新 (update)# 范例一复制一文件建立一目录将文件移动到目录中
[rootstudy ~]# cd /tmp
[rootstudy tmp]# cp ~/.bashrc bashrc
[rootstudy tmp]# mkdir mvtest
[rootstudy tmp]# mv bashrc mvtest
# 将某个文件移动到某个目录去就是这样做# 范例二将刚刚的目录名称更名为 mvtest2
[rootstudy tmp]# mv mvtest mvtest2 这样就更名了简单
# 其实在 Linux 底下还有个有趣的指令名称为 rename
# 该指令专职进行多个档名的同时更名并非针对单一档名变更与 mv 不同。请 man rename。# 范例三再建立两个文件再全部移动到 /tmp/mvtest2 当中
[rootstudy tmp]# cp ~/.bashrc bashrc1
[rootstudy tmp]# cp ~/.bashrc bashrc2
[rootstudy tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到这边如果有多个来源文件或目录则最后一个目标文件一定是『目录』
# 意思是说将所有的数据移动到该目录的意思这是搬移 (move) 的意思当你要移动文件或目录的时后呵呵这个指令就很重要啦 同样的你也可以使用 -u ( update )来测试新旧文件看看是否需要搬移啰另外一个用途就是『变更档名』我们可以很轻易的使用 mv 来变更一个文件的档名呢不过在 Linux 才有的指令当中有个rename 可以用来更改大量文件的档名你可以利用 man rename 来查阅一下也是挺有趣的指令喔
rename(用字符串替换的方式批量改变文件名)
rename [options] expression replacement file...
# 原字符串将文件名需要替换的字符串
# 目标字符串将文件名中含有的原字符替换成目标字符串
# 文件指定要改变文件名的文件列表。
OPTIONS-v, --verboseGive visual feedback which files where renamed, if any.-V, --versionDisplay version information and exit.-s, --symlinkPeform rename on symlink targetrename支持通配符基本的通配符有以下几个
? 可替代单个字符* 可替代多个字符[charset] 可替代charset集中的任意单个字符 文件夹中有这些文件foo1, …, foo9, foo10, …, foo278 如果使用rename foo foo0 foo?仅会把foo1到foo9的文件重命名为foo01到foo09重命名的文件只是有4个字符长度名称的文件文件名中的foo被替换为foo0。如果使用rename foo foo0 foo??foo01到foo99的所有文件都被重命名为foo001到foo099只重命名5个字符长度名称的文件文件名中的foo被替换为foo0。如果使用rename foo foo0 foo*foo001到foo278的所有文件都被重命名为foo0001到foo0278所有以foo开头的文件都被重命名。如果使用rename foo0 foo foo0[2]*从foo0200到foo0278的所有文件都被重命名为foo200到foo278文件名中的foo0被替换为foo。 [rootnode-135 yurq]# touch foo{1..5}
[rootnode-135 yurq]# ll
total 40
-rw-r--r-- 1 root root 40 Aug 3 17:28 file.sed
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo1
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo2
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo3
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo4
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo5
[rootnode-135 yurq]# rename foo foo0 foo?
[rootnode-135 yurq]# ll
total 40
-rw-r--r-- 1 root root 40 Aug 3 17:28 file.sed
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo01
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo02
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo03
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo04
-rw-r--r-- 1 root root 0 Aug 8 11:10 foo0512.6 取得路径的文件名与目录名称dirname, basename
每个文件的完整档名包含了前面的目录与最终的文件名而每个档名的长度都可以到达 255 个字符耶 那么你怎么知道那个是档名那个是目录名嘿嘿就是利用斜线 (/) 来分辨啊 其实取得文件名或者是目录名称一般的用途应该是在写程序的时候用来判断之用的啦 底下我们简单的以几个范例来谈一谈 basename 与dirname 的用途
[rootstudy ~]# basename /etc/sysconfig/network
network 很简单就取得最后的档名
[rootstudy ~]# dirname /etc/sysconfig/network
/etc/sysconfig 取得的变成目录名了该系列目录 -- 【BASH】回顾与知识点梳理目录