文件操作相关命令

本文最后更新于:2023年12月5日 晚上

pwd

[root@centos7 bin]# pwd
/bin
[root@centos7 bin]# pwd -P  # -P 显示真实的物理路径
/usr/bin

basename 和 dirname

[root@4710419222 vhost]# pwd
/usr/local/nginx/conf/vhost
[root@4710419222 vhost]# basename `pwd`  # 显示文件名
vhost
[root@4710419222 vhost]# basename `pwd`\/to2b.cn.conf # 显示路径
to2b.cn.conf
[root@4710419222 vhost]# dirname $(pwd)
/usr/local/nginx/conf

cd

[root@4710419222 ~]# cd -P /bin/ # -P 切换至物理路径, 而非软链接目录
[root@4710419222 bin]# pwd
/usr/bin

切换到来时的目录:cd -

ls

[root@47105171233 ~]# ll -A  # 显示隐藏文件,但是不显示.和..
[root@4710419222 ~]# ll -t  # 按照mtime从新到旧排序
[root@4710419222 ~]# ll -tr  # 按照mtime从旧到新排序
[root@4710419222 ~]# ll -ut / # 按照atime从新到旧排序
[root@4710419222 /]# ll -S  # 按照从大到小排序
[root@4710419222 ~]# ll -R  # 递归遍历目录下所有文件

说明: ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和 @LS_COLORS 变量定义

stat

[root@4710419222 ~]# stat test.php
  File: ‘test.php’
  Size: 96              Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 138598      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-07-26 18:48:51.780437746 +0800  # 文件最近一次被访问的时间
Modify: 2020-07-25 17:21:15.970280822 +0800  # 文件内容最近一次被修改的时间
Change: 2020-07-25 17:21:15.973280860 +0800  # 文件属性最近一次被修改的时间
 Birth: -

file

判断文件的类型不能依靠后缀,可以使用 file 命令判断文件的类型

hexdump

一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件

[root@4710419222 ~]# hexdump -C test.txt # -C 输出规范的十六进制和ASCII码
00000000  0a                                                |.|
00000001

文件通配符 glob

文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件

 # * 匹配零个或多个字符, 但不匹配隐藏文件
[root@4710419222 ~]# ll -a *
-rw-r--r-- 1 root root        863 Oct 17  2019 clear_history.php
-rw-r--r-- 1 root root  244205697 Oct 24  2018 oneinstack-full.tar.gz
lrwxrwxrwx 1 root root         27 Jul 18  2019 python-learn -> /data/wwwroot/python-learn/
-rw-r--r-- 1 root root 1073741824 Oct 31  2018 swapfile
-rw-r--r-- 1 root root      11195 Sep 27  2019 testparm-v.txt
 # ? 匹配任何单个字符
 # [0-9]
 # [a-z] a、A、b、B...x、X、y、Y、z、Z
 # [lujinkai]
 # [^lujinkai]

此外, 还有预定义的字符类: man 7 glob

[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符

文件通配符(glob)和正则表达式(regex):

  • 文件通配符就是* ? [] 这三个,正则表达式则功能强大
  • **对于***文件通配符中*匹配 0 个或多个字符,可以单独使用。而在正则表达式中*是匹配前面的 0 次或多次,前面必须由内容,不能单独使用
  • 对于?*一样,文件通配符中,?可以单独使用,正则表达式中不可以
  • **对于[]**文件通配符[]中的内容是按照 ASCII 统计的,例如[a-z]会匹配 a、A、b、B…y、Y、z,而正则表达式[]中的内容是按照人类的方式统计,例如[a-z]会匹配 a、b、c、d、e…x、y、z
  • 对于. 文件通配符中.就是.,没有别的意思,正则表达式中.匹配单个字符

touch

创建空文件和 刷新文件时间

# -a 仅改变 atime和ctime
# -m 仅改变 mtime和ctime
# -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
# -c 如果文件不存在,则不予创建

cp

-a                # 归档,相当于-dR --preserv=all,常用于备份功能
-u --update       # 只复制源比目标先更新文件或目标不存在的文件
-b                # 目标存在, 覆盖前先备份, 默认形式为`filename~`, 只保留最近一个备份
--backup=numbered # 目标存在, 覆盖前先备份加数字后缀, 形式为`filename.~#~`, 可以保留多个版本

注意:不同类型的文件不能覆盖,例如普通文件可以覆盖普通文件,但是不能覆盖目录

[root@4710419222 test]# ll
drwxr-xr-x 2 root root   12288 Jul 29 15:32 test
[root@4710419222 test]# \cp -a --backup=numbered /test ./xxx
[root@4710419222 test]# \cp -a --backup=numbered /test ./xxx
[root@4710419222 test]# \cp -a --backup=numbered /test ./xxx
[root@4710419222 test]# ll
drwxr-xr-x 2 root root   12288 Jul 29 15:32 test
-rw-r--r-- 1 root root      11 Jul 29 15:30 xxx
-rw-r--r-- 1 root root      11 Jul 29 15:30 xxx.~1~
-rw-r--r-- 1 root root      11 Jul 29 15:30 xxx.~2~

mv

移动和重命名文件,同一分区移动会很快

mv [OPTION]... [-T] SOURCE DEST       # 移动并重命名
mv [OPTION]... SOURCE... DIRECTORY    # 移动到目录
mv [OPTION]... -t DIRECTORY SOURCE... # 目的目录参数在前, 要移动的文件参数在后

-b  # 目标存在, 覆盖前先备份

mvrename
mv 一次只能重命名一个文件,rename 可以批量重命名文件

rename

rename [options] <expression> <replacement> <file>...

# 示例
[root@4710419222 test]# ll
total 4
-rw-r--r-- 1 root root 18 Jul 29 19:36 a.txt
-rw-r--r-- 1 root root  0 Jul 29 19:14 b.txt
[root@4710419222 test]# rename '.txt' '.log' ./* # 修改后缀
[root@4710419222 test]# ll
total 4
-rw-r--r-- 1 root root 18 Jul 29 19:36 a.log
-rw-r--r-- 1 root root  0 Jul 29 19:14 b.log

这个命令好像可以使用正则,但是我试了一下,不行,可能是版本的问题

rm

此命令非常危险, 建议使用 mv 替代 rm

alias rm='DIR=/data/backup`date +%F%T`;mkdir $DIR;mv -t $DIR'

rm 虽然删除了文件,但是在安全场景要求较高的情况下,可以使用 shred 命令安全删除文件

[root@centos8 ~]#shred -zvun 5 passwords.txt
# -z 最后一次覆盖添加0,以隐藏覆盖操作
# -v 能够显示操作进度
# -u 覆盖后截断并删除文件
# -n 指定覆盖文件内容的次数(默认值是3次)

tree

显示目录树

df

查看文件系统,显示磁盘占用情况和 inode 使用情况

df [选项列表]... [文件列表]...
  • -a –all
  • -h –human-readable
  • -i –inodes 显示 inode 信息而非块使用量

关于 df 和 lsblk:

lsblk 查看的是block device,也就是逻辑磁盘大小。df查看的是file system, 也就是文件系统层的磁盘大小

mkdir

-p 目录如果不存在,创建,如果存在,不报错
-m 创建目录时直接指定权限

rmdir

-p 递归删除父空目录

挂载点不能删除

tee

从标准输入读入并写往标准输出和文件,把标准输入的数据复制到文件列表中的每一个文件,同时送往标准输出

tee [选项]... [文件列表]...

-a --append    # 追加到给出的文件。功能:保存不同阶段的输出;复杂管道的故障排除;同时查看和记录输出
[root@centos8 ~]#cat <<EOF | tee /etc/motd
> welcome to magedu
> happy new year
> EOF
welcome to magedu
happy new year

lsof

linux 下万物皆文件,网络也是文件,lsof 的作用是列出打开的文件

lsof 的参数巨多,下面列举常用的参数:

lsof file        # 查看文件被哪些进程占用
lsof -i          # 列出所有的网络连接
lsof -i:port     # 列出指定端口
lsof -i tcp      # 列出所有的tcp网络连接

示例:

[root@k8s-master ~]$lsof -i:10252
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
kube-cont 883 root    7u  IPv4  32376      0t0  TCP localhost:10252 (LISTEN)

seq

https://www.zsythink.net/archives/128/

输出连续的数字,或者固定间隔的数字,或者指定格式的数字

[root@centos8 ~]# seq 0 9
0
1
2
3
4
5
6
7
8
9
[root@centos8 ~]# seq -s ' ' 0 9 # -s 指定输出的分隔符,默认为\n
0 1 2 3 4 5 6 7 8 9
[root@centos8 ~]# seq -s ' ' 0 2 9
0 2 4 6 8
[root@centos8 ~]# seq -s + 1 100 | bc
5050
[root@centos8 ~]# seq -s + 1 2 100 | bc
2500

练习题

  1. 将/etc/issue 文件中的内容转换为大写后保存至/tmp/issue.out 文件中

    [root@centos7 test]# cat /etc/issue | tr 'a-z' 'A-Z' > /tmp/issue.out
  2. 将当前系统登录用户的信息转换为大写后保存至/tmp/who.out 文件中

    [root@centos7 test]# whoami | tr 'a-z' 'A-Z' > /tmp/who.out
  3. 一个 linux 用户给 root 发邮件,要求邮件标题为”help”,邮件正文如下:

    Hello,I am 用户名,The system version is here,please help me to check it,thanks!
    操作系统版本信息

    [root@centos8 ~]# echo -e "Hello, I am `whoami`,The system version is here,please help me to check it ,thanks! \n`cat /etc/os-release`" | mail -s hello root
  4. 将/root/下文件列表,显示成一行,并文件名之间用空格隔开

    [root@4710419222 /]# ls -A /root | tr '\n' ' '
  5. 计算 1+2+3+…+99+100 的总和

    [root@centos8 test]# seq -s + 1 100 | bc
    5050
  6. 删除 Windows 文本文件中的回车字符 ,即“\r”

    cat a.log | tr '\r' ' '
  7. 处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格

    [root@centos8 test]# echo 'xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4' | tr -dc '0-9 '
     1  2  3  4[root@centos8 test]#
  8. 将 PATH 变量每个目录显示在独立的一行

    [root@centos8 test]# echo $PATH | tr ':' '\n'
  9. 将指定文件中 0-9 分别替代成 a-j

    [root@centos8 test]# cat a.log | tr '0-9' 'a-j'
  10. 将文件/etc/centos-release 中每个单词(由字母组成)显示在独立一行,并无空行

    [root@centos8 test]# cat /etc/centos-release | tr -c "[:alpha:]" " " | tr -s " " "\n"
    CentOS
    Linux
    release
    Core
  11. ls 输出的内容明明是分行的, 为什么显示出来就不分行了?

    不单ls 会这样,不少其他命令也会这样。它们会使用 isatty 函数查询输出是否指向终端,对输出到终端和非终端的处理,可能不一样

    常见的比如:
    1、输出到终端时,使用 color,非终端则不用;
    2、输出到终端时,使用 text 方式,非终端则用 binary。

    如果需要一致的输出,应当明确使用相关参数

    這取決於 stdout 是不是終端。如果是終端就可以讀取終端的寬度,根據寬度排版。


文件操作相关命令
http://blog.lujinkai.cn/运维/基础/文件/相关命令/
作者
像方便面一样的男子
发布于
2021年2月4日
更新于
2023年12月5日
许可协议