zoukankan      html  css  js  c++  java
  • 文件与目录操作

    -文件与目录的检视

    ls [-aAdfFhilnrRSt] 文件名或目录名称..

     ls [--color={never,auto,always}] 文件名或目录名称.. 

     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 :依时间排序,而不是用档名。
    --color=never :不要依据文件特性给予颜色显示; --color=always :显示颜色

    --color=auto :让系统自行依据设定来判断是否给予颜色
    --full-time :以完整时间模式 (包含年、月、日、时、分) 输出 --time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time)

    文件/目录 复制 删除 移动

    复制cp

    代码:

    cp 来源文件 目标文件(一般使用)

    cp [-a/d/f/i/l/p/r/s/u] 来源文件(source) 目标文件(destination) (更多复制要求使用)

    选项与参数:
    -a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)

    -d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;

    -f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;

    -i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
    -l :进行硬式连结(hard link)的连结档建立,而非复制文件本身;

    -p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
    -r :递归持续复制,用于目录的复制行为;(常用)
    -s :复制成为符号链接文件 (symbolic link),亦即『快捷方式』文件;
    -u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。 --preserve=all :

    除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。 最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!

    rm(移除文件或目录) 

    rm [-f/i/r] 文件或目录 
    选项与参数:
    -f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
    -i :互动模式,在删除前会询问使用者是否动作
    -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!

    注意代码:rm 目录 删除的是空目录

    mv (移动文件与目录,或更名) 

     mv [-fiu] 文件名 目的地

    选项与参数:
    -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;

    -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
    -u :若目标文件已经存在,且 source 比较新,才会更新 (update) 

    范例一:复制一文件,建立一目录,将文件移动到目录中

    [root@study ~]# cd /tmp
    [root@study tmp]# cp ~/.bashrc bashrc [root@study tmp]# mkdir mvtest
    [root@study tmp]# mv bashrc mvtest
    # 将某个文件移动到某个目录去,就是这样做! 

    **********************

    范例二:将刚刚的目录名称更名为 mvtest2
    [root@study tmp]# mv mvtest mvtest2 

    ***********************

    范例三:再建立两个文件,再全部移动到 /tmp/mvtest2 当中 [root@study tmp]# cp ~/.bashrc bashrc1
    [root@study tmp]# cp ~/.bashrc bashrc2
    [root@study tmp]# mv bashrc1 bashrc2 mvtest2

    # 注意到这边,如果有多个来源文件或目录,则最后一个目标文件一定是『目录!』 # 意思是说,将所有的数据移动到该目录的意思! 

    取得路径的文件名与目录名称 

    取得路径文件名 代码basename 路径

    取得目录名 代码 dirname 路径 

    例子:

    ~ [root@study ~]# basename /etc/sysconfig/network network <== 很简单!就取得最后的档名

    ~ [root@study ~]# dirname /etc/sysconfig/network /etc/sysconfig <== 取得的变成目录名了! 

    文件内容查阅 

    1,cat 由第一行开始显示文件内容

    若无其他查看要求只查看内容代码:cat 文件名

    若查看有其他要求代码如下:

    cat -A/b/E/n/T/v 选项与参数:

    -A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;

    -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
    -E :将结尾的断行字符 $ 显示出来;
    -n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;

    -T :将 [tab] 按键以 ^I 显示出来; -v :列出一些看不出来的特殊字符

    2,tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!  代码:

    tac 文件名

    3,nl 输出的时候,顺道输出行号!

    nl [-bnw] 文件 

    选项与参数:

    b :指定行号指定的方式,主要有两种:

      -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); 

      -b t :如果有空行,空的那一行不要列出行号(默认值); 

    -n :列出行号表示的方法,主要有三种: 

      -n ln :行号在屏幕的最左方显示;

      -n rn :行号在自己字段的最右方显示,且不加 0 ; 

      -n rz :行号在自己字段的最右方显示,且加 0 ; 

    -w :行号字段的占用的字符数。 

    4,more 一页一页的显示文件内容

    代码:more 文件名

    more 后面接的文件内容行数大于屏幕输出的行数时, 就会出现 --more--(%),

    在 more 这个程序的运作过程中,你有几个按键可以按的 :

    -空格键 (space):代表向下翻一页; Enter :代表向下翻『一行』;  

    -Enter :代表向下翻『一行』; 

    -/字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词; 

    -:f :立刻显示出文件名以及目前显示的行数; 

    -q :代表立刻离开 more ,不再显示该文件内容。 

    -b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。 

    5,less与 more 类似,但是比 more 更好的是,他可以往前翻页! 只看头几行 

    代码:less 文件名

    空格键 :向下翻动一页; 

     [pagedown]:向下翻动一页; 

    [pageup] 向上翻动一页;

    /字符串 :向下搜寻『字符串』的功能

    ?字符串 :向上搜寻『字符串』的功能;

    n:重复前一个搜寻 (与 / 或 ? 有关!) 

    N :反向的重复前一个搜寻 (与 / 或 ? 有关!) 

    g :前进到这个资料的第一行去; 

    G :前进到这个数据的最后一行去 (注意大小写); 

    q :离开 less 这个程序; 

    6,head 取出前几行

    代码:head [-n number] 文件 

    若没有加上 -n 这个选项时,默认只显示十行 

    另外那个 -n 选项后面的参数是负数,例如上面范例的-n -100 时,代表列前的所有行数, 但不包括后面 100 行 

    若文件总共131行,令『head -n -100 /etc/man_db.conf』 就会列出前面 31 行,后面 100 行不会打印出来了 。

    7,tail 取出尾巴几行 

    # 默认的情况中,显示最后的十行!

    代码:tail [-n number] 文件

    选项与参数:
    -n :后面接数字,代表显示几行的意思
    -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测 

    取第x行到第y 行,代码:head -n y | tail -n y-x+1 例如:

    取出socket_client.py 的第3到第4行

    [root@rfjmy7h77vmu src]# head -n 4 socket_client.py | tail -n 2

    ip_port=('127.0.0.1',8001)

    非纯文本档: od 

    代码: od [-t TYPE] 文件
    选项或参数:
    -t :后面可以接各种『类型 (TYPE)』的输出,例如:

    a:利用默认的字符来输出;

    c:使用 ASCII 字符来输出

    d[size]:利用十进制(decimal)来输出数据,每个整数占用 size bytes ; 

    f[size]:利用浮点数(floating)来输出数据,每个数占用 size bytes ; 

    o[size]:利用八进制(octal)来输出数据,每个整数占用 size bytes ; 

    x[size]:利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ; 

    范例二:请将/etc/issue 这个文件的内容以 8 进位列出储存值与 ASCII 的对照表

    代码:[root@study ~]# od -t oCc /etc/issue

    *****************

     

    例题:
    我不想找 google,想要立刻找到 password 这几个字的 ASCII 对照,该如何透过 od 来判断?
    答:
    其实可以透过刚刚上一个小节谈到的管线命令来处理!如下所示:
    echo password | od -t oCc
    echo 可以在屏幕上面显示任何信息,而这个信息不由屏幕输出,而是传给 od 去继续处理!就可以得到 ASCII code 对照啰! 

    修改文件时间或建置新档: touch 

     

    每个文件在 linux 底下都会记录许多的时间参数, 其实是 有三个主要的变动时间 :

    -modification time (mtime): 

    当该文件的『内容数据』变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或 权限喔! 

    -status time (ctime):

    当该文件的『状态 (status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊 

    -access time (atime):

    当『该文件的内容被取用』时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man_db.conf , 就会更新该文件的 atime 了。 

    -新建文档

    无任何要求,代码:touch 文件名

    有要求,代码:touch [-a/c/d/m/t] 文件

    选项与参数:
    -a :仅修订 access time;
    -c :仅修改文件的时间,若该文件不存在则不建立新文件;
    -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"

    -m :仅修改 mtime ;
    -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm] 

    范例一: 将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期 

    [dmtsai@study tmp]# cp -a ~/.bashrc bashrc
    [dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

    Tue Jun 16 00:49:24 CST 2015 <==这是目前的时间
    -rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 bashrc <==这是 mtime
    -rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 23:44 bashrc <==这是 atime
    -rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:47 bashrc <==这是 ctime 

    # 注意到,这个文件的大小是 0 呢!在预设的状态下,如果 touch 后面有接文件,
    # 则该文件的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该文件不存在,

    # 则会主动的建立一个新的空的文件喔!

    配置文件隐藏属性

     chattr [+-=][A/S/a/c/d/i/s/t/u] 文件或目录名称

    选项与参数:

    + : 增加某一个特殊参数,其他原本存在参数则不动。

    -:移除某一个特殊参数,其他原本存在参数则不动。

    =: 设定一定,且仅有后面接的参数

    A: 当设定了 A 这个属性时,若你有存取此文件(或目录)时,他的访问时间 atime 将不会被修改, 可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目) 

    S: 一般文件是异步写入磁盘的(原理请参考前一章 sync 的说明),如果加上 S 这个属性时,当你进行任何文件的修改,该更动会『同步』写入磁盘中。

    a: 当设定 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有 root 才能设定这属性 

    c:这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)

    d:当 dump 程序被执行的时候,设定 d 属性将可使该文件(或目录)不会被 dump 备份

    i: 这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、设定连结也无法写入或新增数据!』,对于系统安全性有相当大的帮助!只有 root 能设定此属性

    s:当文件设定了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!

    注意 1:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定 

    注意 2:xfs 文件系统仅支援 AadiS 而已 

     例如:

    [root@rfjmy7h77vmu src]# chattr +i socket_client.py=====》给文件增加了 隐藏属性i
    [root@rfjmy7h77vmu src]# rm socket_client.py
    rm: remove regular file ‘socket_client.py’? y
    rm: cannot remove ‘socket_client.py’: Operation not permitted ===》因为增加了i属性,所以不能删除了
    [root@rfjmy7h77vmu src]# chattr -i socket_client.py

    lsattr(显示文件隐藏属性) 

    代码: lsattr [-a/d/R] 文件或目录
    选项与参数:
    -a :将隐藏文件的属性也秀出来;
    -d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名; -R :连同子目录的数据也一并列出来! 

    -R :连同子目录的数据也一并列出来! 

    -观察文件类型:file

    代码: file 文件名

    如果你想要知道某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary , 且 其中有没有使用到动态函式库 (sharelibrary) 等等的信息,就可以利用 file 这个指令来检阅.如下:

    [root@study ~]# file ~/.bashrc
    /root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文本档啊!

    *****************
    [root@study ~]# file /usr/bin/passwd
    /usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped
    # 执行文件的数据可就多的不得了!包括这个文件的 suid 权限、兼容于 Intel x86-64 等级的硬件平台 # 使用的是 Linux 核心 2.6.32 的动态函式库链接等等。

    **********************
    [root@study ~]# file /var/lib/mlocate/mlocate.db
    /var/lib/mlocate/mlocate.db: data <== 这是 data 文件!

     

    指令与文件的搜寻

     

    -脚本文件名的搜寻

    which 寻找的文件名

     which [-a] 文件名
    -a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

    -文件档名的搜寻

    1, whereis (由一些特定的目录中寻找文件文件名)

     whereis [-b/m/s/u] 文件或目录名 选项与参数:
    -l :可以列出 whereis 会去查询的几个主要目录而已

    -b :只找 binary 格式的文件
    -m :只找在说明文件 manual 路径下的文件
    -s :只找 source 来源文件
    -u :搜寻不在上述三个项目当中的其他特殊文件

    2, locate / updatedb

    locate [-i/r] keyword 文档名

    选项与参数:
    -i :忽略大小写的差异;
    -c :不输出档名,仅计算找到的文件数量

    -l: 仅输出几行的意思,例如输出五行则是 -l 5

    -S: 输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等 

    -r: 后面可接正规表示法的显示方式 

    范例一:找出系统中所有与 passwd 相关的档名,且只列出 5 个 

    [root@rfjmy7h77vmu ~]# locate -l 5 passwd
    /etc/passwd
    /etc/passwd-
    /etc/pam.d/passwd
    /etc/security/opasswd
    /usr/bin/gpasswd

    updatedb

    updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设定,然后再去硬盘里面进行 搜寻文件名的动作, 最后就更新整个数据库文件 

    •  updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库 文件;

    •   locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。 

     

    3,find

    find [PATH] [option] [action] 

    -1). 与时间有关的选项选项与参数:
    与时间有关的共有: -atime, -ctime 与 -mtime ,以 -mtime 说明

    -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件; -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
    -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
    -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名 

    范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出

    [root@study ~]# find / -mtime 0

    # 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,

    # 有变动过内容的文件都会被列出来!

    那如果是三天前的 24 小时内?
    # find / -mtime 3 有变动过的文件都被列出的意思! 

    ****************************

    范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出

    [root@study ~]# find /etc -newer /etc/passwd
    # -newer 用在分辨两个文件之间的新旧关系是很有用的! 

    但如果我想要找出『4 天内被更动过的文件档名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4 天前的那一天』就用『 find /var -mtime 4 』。 有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下:

    图 6.5.1、find 相关的时间参数意义 图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图 6.5.1 我们可以清楚的知道:

    •   +4 代表大于等于 5 天前的檔名:ex> find /var -mtime +4

    •   -4 代表小于等于 4 天内的文件档名:ex> find /var -mtime -4 

    •  4 则是代表 4-5 那一天的文件档名:ex> find /var -mtime 4 

    -2) find  与使用者或组名有关的参数:

    -uid n : n 为数字,这个数字是用户的账号 ID,亦即 UID ,这个 UID 是记录在 /etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。

    -gid n : n 为数字,这个数字是组名的 ID,亦即 GID,这个 GID 记录在 /etc/group,相关的介绍我们会第四篇说明~

    -user name : name 为使用者账号名称喔!例如 dmtsai

    -group name: name 为组名喔,例如 users ;
    -nouser : 寻找文件的拥有者不存在 /etc/passwd 的人!

    -nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!

    当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者, 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

    范例一:搜寻 /home 底下属于 dmtsai 的文件
    [root@study ~]# find /home -user dmtsai
    # 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时,

    # 就可以利用这个指令将属于某个使用者的所有文件都找出来喔! 

    -3)与文件权限及名称有关的参数: 

    -name filename: 搜寻文件名为 filename 的文件;
    -size [+-]SIZE: 搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:

    c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB

    还要大的文件,就是『 -size +50k 』
    -type TYPE : 搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c),

    目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。 -perm mode :搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod

    的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
    -perm -mode : 搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说:

    我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744, 当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来, 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。

    -perm /mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说:

    我们搜寻 -rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在! 

    find 的特殊功能

    选项与参数:

    额外可进行的动作: 

    -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。 

    -print :将结果打印到屏幕上,这个动作是预设动作! 

    范例:将/usr/bin /usr/sbin找到的文件使用 ls -l 列出来~
    [root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} ;

    # 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名, 

    # 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意! 

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     
  • 相关阅读:
    freemarker时间转换197
    用FileZilla服务器端和客户端实现本机与虚拟机之间文件上传和下载197
    springboot pom 详解197
    eclipse svn197
    eclipse 安装git197
    listen()函数中backlog参数分析
    linux 函数库使用
    gdb调试问题汇总
    gdb调试多线程
    linux-C 多线程编程
  • 原文地址:https://www.cnblogs.com/wode110/p/14890346.html
Copyright © 2011-2022 走看看