Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04 文件和目录管理完全指南(7)

Ubuntu 22.04 文件和目录管理完全指南

第1章 Linux文件基础

1.1 Linux文件类型

Linux系统将所有内容视为文件,主要分为7种类型:

bash 复制代码
# 查看文件类型命令
file /etc/passwd /dev/sda /var/log /usr/bin/ls /dev/tty /tmp/testfile
# 输出示例:
# /etc/passwd: ASCII text         # 普通文件
# /dev/sda:  block special       # 块设备文件
# /var/log:  directory           # 目录文件
# /usr/bin/ls: ELF 64-bit LSB executable # 可执行文件
# /dev/tty:  character special  # 字符设备文件
# /tmp/testfile: symbolic link   # 符号链接

文件类型详解:

  1. 普通文件(-):文本文件、二进制文件、可执行文件等
  2. 目录文件(d):包含文件和子目录的列表
  3. 块设备文件(b):以块为单位访问的设备(如硬盘)
  4. 字符设备文件©:以字符为单位访问的设备(如终端)
  5. 符号链接(l):指向另一个文件的指针
  6. 套接字文件(s):进程间通信使用
  7. 管道文件§:进程间通信使用
bash 复制代码
# 创建不同类型文件的示例
touch regular_file.txt          # 创建普通文件
mkdir test_dir                  # 创建目录
ln -s regular_file.txt symlink  # 创建符号链接
mknod block_file b 8 0          # 创建块设备文件(需要root权限)
mknod char_file c 4 0           # 创建字符设备文件(需要root权限)
mkfifo pipe_file                # 创建命名管道

1.2 Linux目录基础

Linux采用树形目录结构,根目录为/。重要目录说明:

bash 复制代码
# 查看目录结构命令
tree -L 1 /  # 需要安装tree: sudo apt install tree

bigdata@bigdata110:/$ tree -L 1 /

/                         # 根目录 - 整个文件系统的起点,所有其他目录的父目录
├── bin -> usr/bin        # 基本命令二进制文件软链接 - 指向/usr/bin,包含系统基本命令如ls、cp等
├── boot                  # 引导加载程序目录 - 包含内核镜像、引导加载程序配置和启动所需文件
├── cdrom                 # 光盘挂载点 - 用于挂载CD/DVD光盘的默认目录
├── dev                   # 设备文件目录 - 包含所有硬件设备和虚拟设备的特殊文件
├── etc                   # 系统配置文件目录 - 包含系统和应用程序的配置文件
├── home                  # 用户主目录 - 存储所有普通用户的个人文件和配置
├── lib -> usr/lib        # 系统库文件软链接 - 指向/usr/lib,包含系统核心共享库
├── lib32 -> usr/lib32    # 32位库文件软链接 - 指向/usr/lib32,32位系统兼容库
├── lib64 -> usr/lib64    # 64位库文件软链接 - 指向/usr/lib64,64位系统主要库
├── libx32 -> usr/libx32  # x32 ABI库文件软链接 - 指向/usr/libx32,x32架构库
├── lost+found            # 文件系统恢复目录 - fsck工具用于存放恢复的碎片文件
├── media                 # 可移动媒体挂载点 - 自动挂载U盘、移动硬盘等可移动设备
├── mnt                   # 临时挂载目录 - 用于手动临时挂载文件系统或网络共享
├── opt                   # 可选软件包目录 - 第三方应用程序的安装位置
├── proc                  # 进程信息虚拟文件系统 - 内核和进程信息的实时接口
├── root                  # root用户主目录 - 系统管理员root的专属家目录
├── run                   # 运行时数据目录 - 包含系统运行时的进程ID、锁文件等
├── sbin -> usr/sbin      # 系统管理命令软链接 - 指向/usr/sbin,系统管理员专用命令
├── snap                  # Snap包目录 - Snap格式应用程序的安装和运行目录
├── srv                   # 服务数据目录 - 存放网络服务如HTTP、FTP等的数据文件
├── swapfile              # 交换文件 - 系统虚拟内存使用的交换文件
├── sys                   # 系统信息虚拟文件系统 - 内核设备、驱动和系统信息的接口
├── tmp                   # 临时文件目录 - 系统和应用程序的临时文件存储位置
├── usr                   # 用户程序目录 - 包含用户应用程序、库、文档等只读数据
└── var                   # 可变数据目录 - 存放经常变化的文件如日志、缓存、数据库等

关键目录详解:

  • /bin:基本可执行命令
  • /etc:系统配置文件
  • /home:用户家目录
  • /var:可变数据文件
  • /tmp:临时文件
  • /usr:用户程序和数据
bash 复制代码
# 查看目录详细信息
ls -ld /etc /home /var
# 输出示例:
# drwxr-xr-x 139 root root  12288 Jan 15 10:30 /etc
# drwxr-xr-x   3 root root   4096 Jan 10 09:15 /home
# drwxr-xr-x  14 root root   4096 Jan 12 16:45 /var

第2章 文件操作命令

2.1 创建空文件命令touch

语法: touch [选项] 文件名

bash 复制代码
# 基本用法:创建空文件
touch newfile.txt
# 同时创建多个文件
touch file1.txt file2.txt file3.txt
# 创建带时间戳的文件
touch file_$(date +%Y%m%d_%H%M%S).txt
# 修改文件时间戳
touch -a file.txt    # 只修改访问时间
touch -m file.txt    # 只修改修改时间
touch -t 202301011200.00 file.txt  # 设置指定时间
# 批量创建文件
touch report_{01..05}.pdf  # 创建report_01.pdf到report_05.pdf
touch log{A..E}.txt        # 创建logA.txt到logE.txt
# 实用案例:创建日志文件
#!/bin/bash
# 创建当日日志文件
LOG_DIR="/var/log/myapp"
mkdir -p $LOG_DIR
touch $LOG_DIR/app_$(date +%Y%m%d).log
echo "日志文件已创建: $LOG_DIR/app_$(date +%Y%m%d).log"

2.2 文件复制命令cp

语法: cp [选项] 源文件 目标文件

bash 复制代码
# 基本复制
cp source.txt destination.txt
# 复制到目录
cp file.txt /home/user/documents/
# 复制多个文件到目录
cp file1.txt file2.txt /home/user/documents/
# 递归复制目录
cp -r /source/dir /destination/
# 保留属性复制
cp -a /source/file /destination/  # 等同于-dpr
# 交互式复制(覆盖前提示)
cp -i source.txt destination.txt
# 显示复制进度
cp -v source.txt destination.txt
# 实用案例:备份配置文件
#!/bin/bash
# 备份重要配置文件
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 复制配置文件并保留权限
cp -a /etc/passwd /etc/shadow /etc/group $BACKUP_DIR/
cp -a /home/user/documents /backup/documents_backup
echo "备份完成到: $BACKUP_DIR"

2.3 文件链接命令ln

语法: ln [选项] 源文件 链接名

bash 复制代码
# 创建硬链接
ln original.txt hardlink.txt
# 创建符号链接
ln -s original.txt symlink.txt
# 创建目录符号链接
ln -s /var/log current_logs
# 强制创建链接(覆盖现有)
ln -sf original.txt newlink.txt
# 查看链接信息
ls -li original.txt hardlink.txt symlink.txt
# 输出示例:
# 1234567 -rw-r--r-- 2 user user 100 Jan 15 10:30 original.txt
# 1234567 -rw-r--r-- 2 user user 100 Jan 15 10:30 hardlink.txt
# 1234568 lrwxrwxrwx 1 user user  12 Jan 15 10:31 symlink.txt -> original.txt
# 实用案例:版本管理
#!/bin/bash
# 软件版本管理
APP_VERSION="1.2.3"
APP_DIR="/opt/myapp"
CURRENT_LINK="/opt/myapp/current"
# 安装新版本
mkdir -p $APP_DIR/$APP_VERSION
cp -r ./dist/* $APP_DIR/$APP_VERSION/
# 更新当前版本链接
ln -sfn $APP_DIR/$APP_VERSION $CURRENT_LINK
echo "当前版本已更新到: $APP_VERSION"

2.4 文件移动命令mv

语法: mv [选项] 源文件 目标位置

bash 复制代码
# 基本移动
mv oldname.txt newname.txt  # 重命名
mv file.txt /home/user/     # 移动到目录
# 移动多个文件
mv file1.txt file2.txt /home/user/docs/
# 交互式移动(覆盖前提示)
mv -i source.txt destination.txt
# 显示移动过程
mv -v *.txt /home/user/docs/
# 移动目录
mv /old/path /new/path
# 实用案例:日志归档
#!/bin/bash
# 将30天前的日志移动到归档目录
LOG_DIR="/var/log/myapp"
ARCHIVE_DIR="/var/log/myapp/archive"
DAYS=30
mkdir -p $ARCHIVE_DIR
find $LOG_DIR -name "*.log" -mtime +$DAYS -exec mv -v {} $ARCHIVE_DIR/ \;
echo "30天前的日志已归档到: $ARCHIVE_DIR"

2.5 文件删除命令rm

语法: rm [选项] 文件名

bash 复制代码
# 删除文件
rm file.txt
# 删除多个文件
rm file1.txt file2.txt
# 交互式删除(确认提示)
rm -i file.txt
# 强制删除(忽略不存在的文件)
rm -f file.txt
# 递归删除目录
rm -r directory/
# 强制递归删除(危险操作!)
rm -rf directory/
# 实用案例:清理临时文件
#!/bin/bash
# 清理7天前的临时文件
TEMP_DIR="/tmp"
DAYS=7
find $TEMP_DIR -type f -mtime +$DAYS -exec rm -v {} \;
find $TEMP_DIR -type d -empty -delete
echo "临时文件清理完成"

第3章 目录操作命令

3.1 显示当前路径命令pwd

语法: pwd [选项]

bash 复制代码
# 显示当前工作目录
pwd
# 显示逻辑路径(跟随符号链接)
pwd -L
# 显示物理路径(不跟随符号链接)
pwd -P
# 实用案例:脚本中获取脚本所在目录
#!/bin/bash
# 获取脚本所在目录
SCRIPT_DIR=$(cd $(dirname $0) && pwd -P)
echo "脚本所在目录: $SCRIPT_DIR"

3.2 改变工作目录命令cd

语法: cd [目录路径]

bash 复制代码
# 切换到指定目录
cd /home/user/documents
# 返回家目录
cd
cd ~
# 返回上一级目录
cd ..
# 返回上一次所在目录
cd -
# 切换到用户家目录
cd ~username
# 相对路径切换
cd ../../otherdir
# 实用案例:快速目录切换
#!/bin/bash
# 创建目录快捷方式
export MARKPATH=$HOME/.marks
mkdir -p $MARKPATH
# 标记目录
mark() {
    mkdir -p $MARKPATH/$1 && ln -s $(pwd) $MARKPATH/$1
}
# 跳转到标记目录
jump() {
    cd -P $MARKPATH/$1
}
# 使用示例
# mark project  # 标记当前目录为project
# jump project  # 跳转到project目录

3.3 列出目录内容命令ls

语法: ls [选项] [目录]

bash 复制代码
# 基本列出
ls
# 详细列表
ls -l
# 显示隐藏文件
ls -a
# 人类可读格式
ls -lh
# 按时间排序
ls -lt
# 递归列出
ls -R
# 显示文件inode
ls -i
# 组合使用
ls -lah /etc
# 实用案例:文件大小统计
#!/bin/bash
# 统计当前目录文件大小
echo "当前目录文件大小统计:"
ls -lah | grep "^-" | awk '{print $5, $9}' | sort -hr
echo "目录大小统计:"
du -sh */ | sort -hr

3.4 创建目录命令mkdir

语法: mkdir [选项] 目录名

bash 复制代码
# 创建单个目录
mkdir newdir
# 创建多个目录
mkdir dir1 dir2 dir3
# 创建多级目录
mkdir -p project/{src,bin,docs,tests}
# 创建带权限的目录
mkdir -m 755 public_dir
# 显示创建过程
mkdir -v newdir
# 实用案例:项目目录结构创建
#!/bin/bash
# 创建标准项目目录结构
PROJECT_NAME="myproject"
BASE_DIR="/home/user/projects"
mkdir -p $BASE_DIR/$PROJECT_NAME/{src/{main,test},docs,config,logs,scripts}
mkdir -p $BASE_DIR/$PROJECT_NAME/src/main/{java,resources}
mkdir -p $BASE_DIR/$PROJECT_NAME/src/test/{java,resources}
echo "项目目录结构已创建: $BASE_DIR/$PROJECT_NAME"
tree $BASE_DIR/$PROJECT_NAME

3.5 删除目录命令rmdir

语法: rmdir [选项] 目录名

bash 复制代码
# 删除空目录
rmdir emptydir
# 删除多级空目录
rmdir -p parent/child/grandchild
# 显示删除过程
rmdir -v emptydir
# 实用案例:清理空目录
#!/bin/bash
# 删除所有空目录
find . -type d -empty -exec rmdir -v {} \;
echo "空目录清理完成"

第4章 文件权限管理

4.1 文件权限组合

Linux文件权限分为三组:所有者(u)、组(g)、其他(o),每组包含读(r=4)、写(w=2)、执行(x=1)权限。

以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。

bash 复制代码
# 查看文件权限
ls -l file.txt
# 输出示例:-rw-r--r-- 1 user group 100 Jan 15 10:30 file.txt
# 权限解析:所有者(读写)、组(只读)、其他(只读)
# 权限数字表示
# 644 = rw-r--r-- (所有者读写,组和其他只读)
# 755 = rwxr-xr-x (所有者读写执行,组和其他读执行)
# 700 = rwx------ (只有所有者有权限)

4.2 变更文件访问者身份

chown命令: chown [选项] 所有者[:组] 文件

bash 复制代码
# 更改文件所有者
sudo chown newuser file.txt
# 同时更改所有者和组
sudo chown newuser:newgroup file.txt
# 递归更改目录所有者
sudo chown -R newuser:newgroup /path/to/directory
# 只更改组
sudo chown :newgroup file.txt
# 实用案例:网站文件权限设置
#!/bin/bash
# 设置网站文件权限
WEB_DIR="/var/www/html"
WEB_USER="www-data"
WEB_GROUP="www-data"
# 设置目录所有者
sudo chown -R $WEB_USER:$WEB_GROUP $WEB_DIR
# 设置目录权限
sudo find $WEB_DIR -type d -exec chmod 755 {} \;
# 设置文件权限
sudo find $WEB_DIR -type f -exec chmod 644 {} \;
echo "网站文件权限设置完成"

4.3 设置文件权限

chmod命令: chmod [选项] 权限 文件

bash 复制代码
# 符号模式设置权限
chmod u+x file.txt    # 给所有者添加执行权限
chmod g-w file.txt    # 删除组的写权限
chmod o=r file.txt    # 设置其他用户只读权限
chmod a+r file.txt    # 给所有用户添加读权限
# 数字模式设置权限
chmod 755 script.sh   # rwxr-xr-x
chmod 644 config.txt  # rw-r--r--
chmod 700 private/    # rwx------
# 递归设置权限
chmod -R 755 /path/to/directory
# 实用案例:安全脚本权限设置
#!/bin/bash
# 设置脚本安全权限
SCRIPT_DIR="/opt/scripts"
# 设置所有脚本为可执行
find $SCRIPT_DIR -name "*.sh" -exec chmod +x {} \;
# 设置配置文件为只读
find $SCRIPT_DIR -name "*.conf" -exec chmod 644 {} \;
# 设置私钥文件为只有所有者可读
find $SCRIPT_DIR -name "*.key" -exec chmod 600 {} \;
echo "脚本权限设置完成"

4.4 设置默认文件权限

umask命令: 设置新建文件的默认权限

bash 复制代码
# 查看当前umask
umask
# 输出示例:0022
# 设置umask
umask 0027  # 新建文件权限为644,目录权限为750
# 临时设置(当前会话有效)
umask 0077
# 永久设置(添加到~/.bashrc)
echo "umask 0027" >> ~/.bashrc
source ~/.bashrc
# 实用案例:安全环境umask设置
#!/bin/bash
# 设置安全umask值
# 0027: 新建文件644,目录750
# 0077: 新建文件600,目录700
echo "当前umask: $(umask)"
# 设置为安全值
umask 0077
echo "新umask: $(umask)"
# 测试新建文件权限
touch testfile
mkdir testdir
ls -ld testfile testdir
# 清理测试文件
rm -rf testfile testdir

4.5 图形界面权限管理

在Ubuntu图形界面中管理文件权限:

bash 复制代码
# 安装图形化权限管理工具
sudo apt install nautilus-admin
# 重新加载文件管理器
nautilus -q
# 现在可以右键文件选择"Properties" -> "Permissions"进行图形化设置

4.6 文件访问控制列表(ACL)

ACL提供更细粒度的权限控制:

bash 复制代码
# 安装ACL工具
sudo apt install acl
# 检查文件系统是否支持ACL
tune2fs -l /dev/sda1 | grep "Default mount options"
# 如果没有,需要重新挂载
sudo mount -o remount,acl /
# 设置ACL
setfacl -m u:username:rwx file.txt  # 给用户添加权限
setfacl -m g:groupname:rw file.txt  # 给组添加权限
setfacl -m o::r file.txt            # 设置其他用户权限
# 查看ACL
getfacl file.txt
# 删除ACL
setfacl -x u:username file.txt      # 删除用户ACL
setfacl -b file.txt                 # 删除所有ACL
# 实用案例:项目协作权限设置
#!/bin/bash
# 设置项目协作权限
PROJECT_DIR="/opt/project"
DEV_GROUP="developers"
TEST_GROUP="testers"
# 创建组
sudo groupadd $DEV_GROUP
sudo groupadd $TEST_GROUP
# 设置基本权限
sudo chmod 750 $PROJECT_DIR
# 设置ACL
sudo setfacl -m g:$DEV_GROUP:rwx $PROJECT_DIR
sudo setfacl -m g:$TEST_GROUP:rx $PROJECT_DIR
sudo setfacl -d -m g:$DEV_GROUP:rwx $PROJECT_DIR  # 默认ACL
sudo setfacl -d -m g:$TEST_GROUP:rx $PROJECT_DIR
# 验证设置
getfacl $PROJECT_DIR
echo "项目协作权限设置完成"

第5章 综合实战案例

案例1:安全文件服务器设置

bash 复制代码
#!/bin/bash
# 安全文件服务器设置脚本
# 1. 创建目录结构
BASE_DIR="/srv/fileserver"
sudo mkdir -p $BASE_DIR/{public,private,temp}
# 2. 创建用户组
sudo groupadd fileserver_users
sudo groupadd fileserver_admins
# 3. 设置目录权限
sudo chown root:fileserver_admins $BASE_DIR
sudo chmod 750 $BASE_DIR
sudo chown root:fileserver_users $BASE_DIR/public
sudo chmod 775 $BASE_DIR/public
sudo chown root:fileserver_admins $BASE_DIR/private
sudo chmod 770 $BASE_DIR/private
sudo chmod 1777 $BASE_DIR/temp  # 粘滞位
# 4. 设置ACL
sudo setfacl -m g:fileserver_admins:rwx $BASE_DIR
sudo setfacl -m g:fileserver_users:rx $BASE_DIR
sudo setfacl -m g:fileserver_users:rwx $BASE_DIR/public
sudo setfacl -d -m g:fileserver_users:rwx $BASE_DIR/public
sudo setfacl -m g:fileserver_admins:rwx $BASE_DIR/private
sudo setfacl -d -m g:fileserver_admins:rwx $BASE_DIR/private
# 5. 设置umask
echo "umask 0027" | sudo tee -a /etc/profile
echo "文件服务器设置完成"
echo "目录结构:"
tree $BASE_DIR

案例2:自动化备份脚本

bash 复制代码
#!/bin/bash
# 自动化备份脚本
SOURCE_DIR="/home/user/documents"
BACKUP_DIR="/backup/$(date +%Y%m%d)"
LOG_FILE="/var/log/backup.log"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
rsync -av --delete $SOURCE_DIR/ $BACKUP_DIR/ >> $LOG_FILE 2>&1
# 设置备份文件权限
chmod 600 $BACKUP_DIR/*
chown $USER:$USER $BACKUP_DIR/*
# 压缩备份
tar -czf $BACKUP_DIR.tar.gz -C $(dirname $BACKUP_DIR) $(basename $BACKUP_DIR)
rm -rf $BACKUP_DIR
# 记录日志
echo "$(date): 备份完成 - $BACKUP_DIR.tar.gz" >> $LOG_FILE
echo "备份完成: $BACKUP_DIR.tar.gz"

本章小结

本章详细介绍了Ubuntu 22.04中文件和目录管理的各个方面,包括:

  • Linux文件类型和目录结构
  • 文件操作命令的详细用法
  • 目录操作命令的应用
  • 文件权限管理的各种方法
  • 图形界面和ACL权限控制
  • 实际应用场景的综合案例
    掌握这些知识将帮助您高效管理Ubuntu系统的文件和目录,确保数据安全和系统稳定运行。建议在实际环境中多练习这些命令,结合具体需求灵活运用。
相关推荐
De-Alf2 小时前
Megatron-LM学习笔记(5)Model Linear线性层
笔记·学习·ai
Mr-Wanter2 小时前
麒麟V10x86 系统 curl报错SSLv3符号缺失问题解决
linux·服务器·github
VekiSon2 小时前
Linux系统编程——网络:TCP 协议与通信实战
linux·网络·tcp/ip
翻斗花园岭第一爆破手2 小时前
flutter学习1
学习·flutter
做cv的小昊2 小时前
【TJU】信息检索与分析课程笔记和练习(4)中文文献检索—CNKI
大数据·经验分享·笔记·学习·信息可视化·全文检索·信息检索
苦逼IT运维2 小时前
VMware Horizon 与 Docker 冲突排错记录
linux·运维·docker·容器·自动化
崇山峻岭之间2 小时前
Matlab学习记录12
android·学习·matlab
阿拉伯柠檬2 小时前
应用层协议HTTP
linux·网络·c++·网络协议·http
小李独爱秋2 小时前
Linux操作系统实验报告单(13) 显示进程列表
linux·运维·服务器·操作系统·实验报告单