摘要
文件与目录的查看、创建、修改、删除等相关命令
本文基于CentOS8(x86_64)
文件与目录的基本操作
1.查看目录下的内容:
1 2 3 4 5 6 7 8 ls . : 查看当前路径下的文件,当前目录可以不加'.' ls -1 : 注意这里是数字1,列表展示当前目录下的文件及目录的名称ls -1 -c : 以更改时间(ctime)倒序,显示文件和目录,默认按字母排序ls -l : -l以列表的形式显示详细信息,包括文件类型和权限、文件所属用户和用户组、最后修改时间等等ls -al : -a显示所有文件包括隐藏文件以及当前目录(.)和上级目录(..),如果不希望展示这两个路径可以使用-Als -lh : 以人类便于理解的方式展示文件大小,K、M等等ls dir : 查看指定目录下的文件ls -l dir : 查看指定目录下的文件,列表展示
1 2 3 ls -lSh : 从大到小ls -lShr : 从小到大
1 2 3 4 5 ls -lt : 按mtime从大到小ls -ltr : 按mtime从小到大ls -ltc : 按ctime从大到小ls -ltcr : 按ctime从小到大
小贴士
1 2 3 4 5 6 7 8 $ which ll alias ll='ls -l --color=auto' /usr/bin/ls $ ll drwxr-xr-x 6 root root 4096 7月 23 2021 apache-maven-3.8.1 -rw-r--r-- 1 root root 9536838 3月 31 2021 apache-maven-3.8.1-bin.tar.gz lrwxrwxrwx 1 root root 18 7月 23 2021 maven -> apache-maven-3.8.1
展示出来的信息可以分为7组,意思如下:
[1]:权限
[2]:连结
[3]:拥有者
[4]:群组
[5]:文件容量
[6]:修改日期
[7]:文件或目录名称
2.查看目录或文件的属性
1 2 ll -d dir :-d只显示目录信息 ll file :查看指定文件信息
3.切换目录
1 2 3 4 cd / :切换到根目录cd .. :回到上级目录cd - :返回到上一次访问的目录cd dir :切换到指定目录
4.查看当前路径
5.创建空文件
6.创建目录
1 2 mkdir dir mkdir -p dir /dir/dir :创建多级目录
7.文件和目录复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cp sourcefile todir :复制到指定目录,保持原文件名cp file1 file2 todir :同时复制多个文件到指定目录下cp sourcefile todir/newfile :复制到指定目录,并重命名文件cp -R sourcedir todir :如果todir不存在,则将sourcedir下的内容复制到todir目录下,如果todir已经存在,则将sourcedir复制到todir目录下cp sourcedir/* todir :复制目录下的文件到指定目录,不含sourcedircp -n sourcefile todir :如文件已经存在,则不覆盖cp -f sourcefile todir :如文件已经存在,则强制覆盖cp -a sourcedir todir :保持源文件的所有属性不变,并且以递归方式复制目录和子目录
8.移动文件、重命名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 mv file1 file2 :重命名file1为file2mv file todir :将文件移动到指定目录下mv dir todir :如果todir不存在,则将dir 重命名为todir,如果todir已经存在,则将dir 移动到todir目录下mv dir todir/ :如果todir不存在,则将dir 重命名为todir,如果todir已经存在,则将dir 移动到todir目录下mv -n file todir :如有重复,则不覆盖mv -f file todir :如有重复,则强制覆盖rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo rename命令的参数有三项: 其一是当前文件名中要被修改的字符; 其二是其要被修改为的新字符; 其三是要被执行的对象文件列表,可以用正则表达式确定范围 rename .txt .php * rename 's/x0*/new/' *
小贴士
进行cp
或mv
操作时,非重命名操作最好都先通过mkdir
创建好目标目录
9.文件和目录删除
1 2 3 rm -f file : 删除文件rm -rf dir : 删除目录
10.显示文件内容相关
cat :显示文件所有内容
将多行内容输入到文件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 cat <<EOF > a.txt <?xml version="1.0"?> <items> <item uid="localip" arg="$LOCAL"> <title>Local IP: $LOCAL</title> <subtitle>Press Enter to paste, or Cmd+C to copy</subtitle> <icon>icon.png</icon> </item> <item uid="externalip" arg="$EXTERNAL"> <title>External IP: $EXTERNAL</title> <subtitle>Press Enter to paste, or Cmd+C to copy</subtitle> <icon>icon.png</icon> </item> </items> EOF cat <<EOF >> a.txt <?xml version="1.0"?> <items> <item uid="localip" arg="$LOCAL"> <title>Local IP: $LOCAL</title> <subtitle>Press Enter to paste, or Cmd+C to copy</subtitle> <icon>icon.png</icon> </item> <item uid="externalip" arg="$EXTERNAL"> <title>External IP: $EXTERNAL</title> <subtitle>Press Enter to paste, or Cmd+C to copy</subtitle> <icon>icon.png</icon> </item> </items> EOF
cat << 'EOF' > file...EOF
和 cat << EOF > file...EOF
是有区别的
对比项
cat << 'EOF' > file
cat << EOF > file
分隔符是否加引号
✅ 加单引号 'EOF'
❌ 不加引号 EOF
变量是否会被展开($VAR)
❌ 不会展开,保留 $VAR
原样
✅ 会展开,替换成变量值
命令替换是否执行($(…))
❌ 不会执行,保留为字符串
✅ 会执行命令并插入结果
反引号命令(`command`)
❌ 不执行
✅ 会执行
转义字符(\t, \n 等)
❌ 被视为普通字符
✅ 会解释成制表符、换行等
用途
适合写入脚本模板、Dockerfile 等原样内容
适合动态插入变量或命令结果生成配置等
推荐使用场景
写入 shell 脚本、代码段、需要保留 $
的内容
生成带变量或时间戳的文本、日志文件等
示例内容中的 $HOME
输出为 $HOME
输出为 /home/username
(或当前用户主目录)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 cat << EOF > docker_tags #!/bin/bash # 用法提示 if [ -z "\$1" ]; then echo "用法: \$0 <镜像名称,例如 nginx 或 library/nginx>" exit 1 fi IMAGE_NAME=\$1 # 使用 skopeo 获取镜像信息并解析标签列表 docker run --rm quay.io/skopeo/stable:latest \\ inspect --override-os linux docker://docker.1ms.run/\$IMAGE_NAME \\ | jq '.RepoTags[]' EOF cat << 'EOF' > docker_tagsif [ -z "$1 " ]; then echo "用法: $0 <镜像名称,例如 nginx 或 library/nginx>" exit 1 fi IMAGE_NAME=$1 docker run --rm quay.io/skopeo/stable:latest \ inspect --override-os linux docker://docker.1ms.run/$IMAGE_NAME \ | jq '.RepoTags[]' EOF
more :分页显示文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 more file 下一页: 空格 下一行: 回车 退出 : q 选项 含义 -f 计算行数时,以实际的行数,而不是自动换行过后的行数。 -p 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容。 -c 跟 -p 选项相似,不同的是先显示内容再清除其他旧资料。 -s 当遇到有连续两行以上的空白行时,就替换为一行的空白行。 -u 不显示下引号(根据环境变量 TERM 指定的终端而有所不同)。 +n 从第 n 行开始显示文件内容,n 代表数字。 -n 一次显示的行数,n 代表数字。
head :显示文件前几行,默认是10行
1 head -20 file : 显示开头的20行
tail :显示文件最后几行,默认是10行
1 2 3 tail -20 file : 显示结尾的20行tail -f file -n 100 : 动态显示文件内容,先显示最后100行内容,用于查看日志tail -f file | grep key : 动态显示文件内容,配合grep使用,只显示关心的内容
less :与more类似,不过less更加高效,推荐使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 less file 选项 选项含义 -N 显示每行的行号。 -S 行过长时将超出部分舍弃。 -e 当文件显示结束后,自动离开。 -g 只标志最后搜索到的关键同。 -Q 不使用警告音。 -i 忽略搜索时的大小写。 -m 显示类似 more 命令的百分比。 -f 强迫打开特殊文件,比如外围设备代号、目录和二进制文件。 -s 显示连续空行为一行。 -b <缓冲区大小> 设置缓冲区的大小。 -o <文件名> 将 less 输出的内容保存到指定文件中。 -x <数字> 将【Tab】键显示为规定的数字空格。
more 和 less的区别
1、less可以按键盘上下方向键显示上下内容,而more不能通过上下方向键控制显示
2、less不必读整个文件,加载速度会比more更快
3、less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容
4、阅读到文件结束时,less不会退出,而more会
5、less可用行号或百分比作为书签浏览文件,而more不行
6、相比more,less提供更加友好的检索、高亮显示等操作
strings :查看二进制文件中可以读取的字符部分
1 strings /lib64/libc.so.6 | grep GLIBC
11.软链接与硬连接
1 2 ln -s file/dir file/dir : 软连接ln file file : 硬连接
软链接 与 硬链接 的区别
软链接(soft link)
:也称为符号链接(Symbolic Link),类似于 Windows 操作系统中的快捷方式文件,该文件有自己的名称、inode 和 物理存储的文件数据(记录着另一文件的路径名指向),访问该文件会被重新定向到软链接所指的源文件名。
硬链接(hard link)
:相当于为当前文件名对应的文件再创建一个文件别名,当前文件名与该文件别名对应的 inode 和 物理存储的文件数据 都是一样的,访问该文件别名同访问当前文件名一致。
1.删除源文件,软链接 会失效(但不会被自动删除),硬链接 不会失效(文件并没有被真正删除);
2.软链接 可以为文件和目录(允许不存在)创建链接,硬链接 只可以为文件创建链接;
3.软链接 可以跨文件系统,硬链接 必须是同一个文件系统;
4.软链接 的文件权限 可以和源文件不一样,硬链接 的文件权限 一定和源文件一样;
5.软链接:作为可执行文件的快捷方式;
6.硬链接:备份重要文件。
12.查看文件或目录的大小
1 2 3 4 5 6 7 8 9 10 11 12 du -h file : 查看文件大小du -sh dir : 查看目录大小du -sh * : 查看当前目录下所有文件和目录的大小,只能显示当前目录下的非隐藏文件和文件夹的磁盘使用情况du -sh .[^.]* : 查看隐藏文件和文件夹的磁盘使用情况du -sh * .[^.]* : 查看所有文件和文件夹(包括隐藏的和非隐藏的)的磁盘使用情况du -sh * | sort -h : 正序du -sh * | sort -hr : 倒序
13.查看文件、目录详细时间参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 stat file/dir : 列出访问时间,最后修改时间,等等stat apache-maven-3.8.1-bin.tar.gz 文件:"apache-maven-3.8.1-bin.tar.gz" 大小:9536838 块:18632 IO 块:4096 普通文件 设备:fd01h/64769d Inode:1078257 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 最近访问:2023-03-03 10:06:52.371937028 +0800 最近更改:2021-03-31 01:41:19.000000000 +0800 最近改动:2021-07-23 15:25:42.624723562 +0800 创建时间:- 1. 最近访问(Access Time) :简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间。 2. 最近更改(Modify Time) :简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。就是 ls -l 里显示的时间。 3. 最近改动(Change Time) :简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。
小贴士
使用touch
命令修改文件的时间戳
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 $ touch --help 用法:touch [选项]... 文件... Update the access and modification times of each FILE to the current time. A FILE argument that does not exist is created empty, unless -c or -h is supplied. A FILE argument string of - is handled specially and causes touch to change the times of the file associated with standard output. Mandatory arguments to long options are mandatory for short options too. -a 只更改访问时间 -c, --no-create 不创建任何文件 -d, --date =字符串 使用指定字符串表示时间而非当前时间 -f (忽略) -h, --no-dereference 会影响符号链接本身,而非符号链接所指示的目的地 (当系统支持更改符号链接的所有者时,此选项才有用) -m 只更改修改时间 -r, --reference=FILE use this file's times instead of current time -t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time --time=WORD change the specified time: WORD is access, atime, or use: equivalent to -a WORD is modify or mtime: equivalent to -m --help 显示此帮助信息并退出 --version 显示版本信息并退出 请注意,-d 和-t 选项可接受不同的时间/日期格式。 # 示例 # 修改atime touch -a test : 修改为当前系统时间 touch -a -d "2023-03-02 11:37:08" test.sh : 修改为指定的时间 touch -a -t "202303021137.08" test.sh # 修改mtime touch -m test : 修改为当前系统时间 touch -m -d "2023-03-02 11:37:08" test.sh : 修改为指定的时间 touch -m -t "202303021137.08" test.sh # 注意,修改atime或mtime时,都会同时修改ctime,因为文件的状态发生了变化
14.查看文件的MD5或SHA值
1 2 3 4 5 md5sum filesha256sum filesha512sum file
15.查看硬盘分区情况及其挂载点
1 2 3 4 5 6 7 df -h : 显示硬盘大小,自动使用最大的单位df -Th : 同时显示分区类型df -hl : 只显示本机的文件系统df : 分区容量全部使用单位K,等同于 df -kdf -m : 分区容量全部使用单位M
16.将文件转换为16进制格式
1 2 3 4 5 xxd file > 16file xxd r 16file file
17.命令别名alias
1 2 3 4 echo "alias ls='ls -l'" >> ~/.bashrcsource ~/.bashrc
1 2 3 4 5 6 7 8 whcih cp \cp file1 file2 \ls
18.创建指定大小的文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 dd if =/dev/zero of=testfile bs=1M count=100dd if =/dev/zero of=testfile bs=1M count=1024 fallocate -l 100M testfile fallocate -l 1G testfile
19.查看命令的执行时间:time command
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ time dd if =/dev/zero of=testfile bs=1M count=1024 记录了1024+0 的读入 记录了1024+0 的写出 1073741824字节(1.1 GB)已复制,9.42705 秒,114 MB/秒 real 0m9.429s user 0m0.004s sys 0m0.769s $ time fallocate -l 1G testfile real 0m0.002s user 0m0.000s sys 0m0.002s
20.查看目录结构: tree
1 2 3 4 5 6 7 8 $ sudo dnf install tree.x86_64 -y $ tree -L <level> <dir > $ tree -L 2 $ tree -L 2 /etc