未记录事实核验 · 状态:现行内容

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适合在 Bash 与常见 GNU 命令环境中学习 Linux 基础文件和目录操作,目录布局、组件安装位置及权限应以实际系统为准;建议在测试目录完成练习,删除、移动和覆盖示例不应直接作为生产脚本使用。下文使用 ls -lh 的人类可读大小示意,日期时间格式受实现和区域设置影响,不能依赖固定空白字段解析文件名;下一步导航已统一为一组。本次仅作全文结构审阅,未执行命令或进行外部事实、链接核验。

文件系统与目录操作 - Linux 文件操作完全指南

abstract 本文概要

  • Linux 目录结构详解
  • 绝对路径与相对路径
  • 核心文件操作命令:cd/ls/pwd/mkdir/rm/cp/mv
  • 通配符和文件查找
  • 数据工作中的实际应用场景

Linux 目录结构

Linux 的目录是一棵倒置的树,根是 /。

/
├── bin/          基础命令(ls、cp、rm 等),所有用户可用
├── sbin/         系统管理命令(执行权限及是否需要 root 取决于具体命令和操作)
├── etc/          ★配置文件目录(nginx、hadoop、hosts 等都在这)
├── home/         ★普通用户家目录
│   ├── alice/    用户 alice 的工作目录
│   └── bob/      用户 bob 的工作目录
├── root/         root 用户的家目录(不在 home 下)
├── var/
│   └── log/      ★系统和应用日志(排查问题必看)
├── tmp/          临时文件(清理时机由系统策略决定,不要放重要数据)
├── usr/
│   ├── bin/      大量用户可用的命令,通常由系统软件包安装
│   └── local/    本地编译安装的软件
├── opt/          ★第三方软件(Hadoop/Spark 通常装这里)
├── data/         数据目录(公司自定义,不是 Linux 标准)
├── proc/         虚拟文件系统,存放进程和系统信息
└── dev/          设备文件

note 数据工程师最关心的目录

  • ~:当前用户的家目录,普通用户常见位置为 /home/你的用户名/,实际位置由账号配置决定,可用于存放代码和脚本
  • /opt/ 或 /data/:Hadoop、Spark、Kafka 等组件的安装目录
  • /var/log/:排查问题时翻日志
  • /etc/:修改配置文件(比如 /etc/hosts)
  • /tmp/:存临时文件,但不可靠

路径概念:绝对路径 vs 相对路径

绝对路径

从根目录 / 开始的完整路径,在任何位置都有效。

/home/alice/data/access.log
/opt/hadoop/logs/hadoop-root-namenode.log
/etc/hadoop/core-site.xml

相对路径

相对于当前目录的路径,用 .(当前目录)和 ..(上一级目录)表示。

# 假设当前在 /home/alice/
data/access.log          # 等同于 /home/alice/data/access.log
./data/access.log        # 同上,. 表示当前目录
../bob/data/file.csv     # 上一级(/home/),再进 bob/data/

# 特殊符号
~                        # 当前用户的家目录,等同于 /home/alice/
~/data/access.log        # /home/alice/data/access.log

tip 实用建议

  • 写脚本时用绝对路径,避免脚本在不同目录下执行时出错
  • 日常交互时用相对路径,敲的字少
  • ~ 是家目录的快捷方式,大量使用

核心命令详解

pwd - 我在哪里

Print Working Directory,显示当前所在目录。

# 数据工作场景:忘了自己在哪个目录,第一步就是 pwd
pwd
# /home/alice/projects/etl

# 输出当前目录(默认打印换行)
echo "$PWD"

cd - 切换目录

Change Directory,最高频的命令之一。

# 进入指定目录(绝对路径)
cd /opt/hadoop/logs

# 进入子目录(相对路径)
cd data

# 回到上一级目录
cd ..

# 回到上两级
cd ../..

# 回到家目录(三种方式等效)
cd
cd ~
cd $HOME

# 回到上次所在的目录(在两个目录间切换非常方便)
cd -

# 进入含空格的目录(用引号或反斜杠)
cd "My Data"
cd My\ Data

tip 数据工作场景:快速切换目录

# 经常要在工作目录和日志目录之间切换
cd /data/logs    # 去看日志
# 查看完,回到工作目录
cd -             # 瞬间回到上次目录,比重新输路径快

ls - 列出文件

List,查看目录内容,使用频率极高。

# 列出当前目录
ls

# 列出指定目录
ls /opt/hadoop/logs

# 详细信息(权限、大小、时间)
ls -l

# 以人类可读的格式显示文件大小(KB/MB/GB)
ls -lh

# 显示隐藏文件(以 . 开头的文件)
ls -la

# 按时间排序(最新的在前面)
ls -lt

# 按文件大小排序(最大的在前面)
ls -lS

# 递归显示子目录内容
ls -R

# 只显示目录
ls -d */

ls -lh 输出解读(日期格式仅为示意,实际格式受实现、区域设置及选项影响):

-rw-r--r-- 1 alice data  1.2G 2026-03-15 09:30 access.log
drwxr-xr-x 2 alice data  4.0K 2026-03-15 09:00 output/

# 解读:
# 第1列:文件类型和权限(详见 [[【技术与工具】/Linux/05-文件权限与用户管理]])
# 第2列:硬链接数
# 第3列:文件所有者
# 第4列:文件所属组
# 第5列:文件大小
# 随后的日期和时间:最后修改时间(此示例占两个空白分隔字段)
# 日期时间之后:文件名;文件名可含空格,不应以固定空白字段号解析

note 数据工作场景

# 查看数据文件,按大小排序,判断是否超预期
ls -lhS /data/warehouse/ods/

# 查看日志目录,按时间排序,找最新的日志
ls -lt /var/log/spark/

mkdir - 创建目录

# 创建单个目录
mkdir output

# 创建多级目录(-p 参数,parent)
mkdir -p /data/warehouse/ods/user_behavior/2026-03-18

# 创建多个目录
mkdir dir1 dir2 dir3

# 创建目录时设置权限
mkdir -m 755 shared_dir

tip 数据工作场景:按日期组织数据目录

# 自动创建日期目录(在脚本中常用)
DATE=$(date +%Y-%m-%d)
mkdir -p /data/raw/${DATE}

rm - 删除文件

warning 高危命令!rm 通常不进入桌面回收站!

删除后不能依靠回收站撤销;能否恢复取决于备份、快照及文件系统等条件,不应依赖事后恢复。执行前请三思,尤其是含通配符 * 的删除命令。 生产环境操作,建议先 ls 确认要删的文件,再执行 rm。

# 删除文件
rm file.txt

# 删除多个文件
rm file1.txt file2.csv

# 删除目录(-r 递归删除目录及其内容)
rm -r old_data/

# 强制删除,不提示(-f force)
rm -f file.txt

# 递归强制删除目录(生产环境谨慎使用!)
rm -rf old_data/

# 交互式删除(每个文件都会询问 y/n,安全)
rm -i *.log

warning 永远不要执行的命令

rm -rf /          # 常见 GNU rm 默认拒绝递归删除根目录;不要尝试或依赖该保护
rm -rf /*         # 可能删除根目录下通配符匹配的内容,根目录保护不能替代路径检查
rm -rf ./*        # 递归删除当前目录中通配符匹配的内容,通常不含隐藏项

假设性风险示例:若误执行 rm -rf /data /,空格会使 /data 和 / 成为两个独立参数,可能删除 /data 中有权限删除的内容;常见 GNU rm 默认拒绝递归删除 /。这不是有来源的真实事故记录,也不能据此认为该命令安全。

cp - 复制文件

# 复制文件
cp source.txt destination.txt

# 复制到指定目录(保持文件名)
cp data.csv /backup/

# 复制整个目录(-r 递归)
cp -r /data/raw/ /backup/raw/

# 保留文件属性(时间戳、权限等)
cp -p data.csv /backup/

# 复制时保留所有属性(推荐用于备份)
cp -a /data/src/ /data/dst/

# 复制前询问(避免覆盖)
cp -i data.csv /backup/

# 显示复制操作信息(不显示百分比或实时复制进度)
cp -v large_file.tar.gz /backup/

tip 修改配置文件前先备份

# 好习惯:改配置前先备份
cp /etc/hadoop/core-site.xml /etc/hadoop/core-site.xml.bak.20260318
# 改完有问题,直接恢复
cp /etc/hadoop/core-site.xml.bak.20260318 /etc/hadoop/core-site.xml

mv - 移动/重命名文件

# 重命名文件(在同一目录下移动 = 重命名)
mv old_name.txt new_name.txt

# 移动文件到目录
mv data.csv /data/archive/

# 移动整个目录
mv /data/raw/ /data/archive/

# 移动多个文件到目录
mv file1.csv file2.csv file3.csv /data/archive/

# 移动时提示是否覆盖
mv -i source.txt /dest/

# 强制移动(不提示)
mv -f source.txt /dest/

通配符

通配符让你一次操作多个文件,非常实用。

# * 匹配任意数量的任意字符
ls *.csv            # 列出所有 .csv 文件
rm /tmp/temp_*      # 删除所有以 temp_ 开头的文件
cp /data/2026-03-*.log /backup/  # 复制所有 2026-03 月的日志

# ? 匹配单个任意字符
ls data_?.csv       # 匹配 data_1.csv、data_a.csv,但不匹配 data_12.csv

# [] 匹配方括号内的字符之一
ls data_[123].csv   # 匹配 data_1.csv、data_2.csv、data_3.csv
ls log_[0-9].txt    # 匹配 log_0.txt 到 log_9.txt

# {} 大括号展开(不是通配符,是 bash 特性)
mkdir -p /data/{raw,processed,output}/{2026-03-17,2026-03-18}
# 等效于创建 6 个目录的组合

find - 查找文件

# 在当前目录及子目录中查找文件
find . -name "*.log"

# 在指定目录查找
find /var/log -name "*.log"

# 按文件大小查找(+表示大于,-表示小于)
find /data -size +1G        # 按 GiB 单位向上取整后大于 1 的条目大小
find /tmp -size -1M         # 按 MiB 单位向上取整后小于 1 的条目大小,并非所有小于 1 MiB 的文件

# 按修改时间查找
find /data -mtime -1        # 1 天内修改过的文件
find /data -mtime +30       # 修改时间距今的完整 24 小时段数大于 30,即至少 31 天(可用于清理归档)

# 查找并执行操作(-exec)
# 示例:删除修改时间至少为 31 天前的匹配日志;生产使用前须确认范围、保留策略及备份,并先预览匹配结果
find /var/log/app -name "*.log" -mtime +30 -exec rm {} \;

# 查找空文件
find /data -empty

# 按文件类型查找
find /opt -type d -name "hadoop"    # 查找名为 hadoop 的目录(d=directory)
find /data -type f -name "*.csv"    # 查找所有 csv 文件(f=file)

note 数据工作场景:找大文件

# 磁盘快满了,列出前 20 个匹配的、大小超过 500 MiB 的普通文件(未按大小排序)
find / -type f -size +500M 2>/dev/null | head -20

# 找出最近 24 小时内修改过的匹配数据文件(不代表今天创建)
find /data/raw -name "*.csv" -mtime -1

文件类型识别

# 查看文件类型(很有用,不要被扩展名骗了)
file data.csv
# data.csv: CSV text

file hadoop.tar.gz
# hadoop.tar.gz: gzip compressed data

file unknown_file
# unknown_file: ASCII text

# 查看文件大小
du -sh /data/warehouse/     # -s 汇总,-h 人类可读
du -sh /data/*              # 查看各子目录大小

# 查看磁盘使用情况(数据工程师必备,磁盘满了很麻烦)
df -h
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   45G  2.0G  96% /

warning 磁盘使用率超过 85% 就要警惕

很多数据故障源于磁盘写满。定期 df -h 检查是个好习惯。


实战:整理数据目录结构

# 场景:把杂乱的数据文件整理成按日期的目录结构

# 1. 查看现状
ls -lh /data/raw/
# access_20260315.log  access_20260316.log  access_20260317.log
# orders_20260315.csv  orders_20260316.csv

# 2. 创建目录结构
for date in 20260315 20260316 20260317; do
    mkdir -p /data/raw/${date}/{logs,orders}
done

# 3. 移动文件
mv /data/raw/access_20260315.log /data/raw/20260315/logs/
mv /data/raw/orders_20260315.csv /data/raw/20260315/orders/
# ... 其他文件类似

# 4. 验证结果
find /data/raw -type f | sort

快速参考

命令 用途 常用参数
pwd 显示当前目录 -
cd 目录 切换目录 cd ~ 家目录,cd - 上次目录
ls 列出文件 -l 详细,-h 人类可读,-t 按时间
mkdir 创建目录 -p 创建多级目录
rm 删除文件 -r 删目录,-f 强制
cp 复制文件 -r 复制目录,-a 保留属性
mv 移动/重命名 -
find 查找文件 -name、-size、-mtime
du -sh 查看目录大小 -s 汇总,-h 人类可读
df -h 查看磁盘使用 -

下一步


info 前置知识


掌握检查

  • [ ] 能用 pwd 确认当前位置,用 cd - 快速回到上一个目录
  • [ ] 能区分绝对路径(以 / 开头)和相对路径(不以 / 开头,如 data/access.log、./data/access.log、../data/access.log),并能结合当前目录互相转换
  • [ ] 用 rm -rf 前知道检查路径是否正确,不会误删重要目录
  • [ ] 能用 find /data -name "*.csv" -mtime -1 找出最近一天修改过的 CSV 文件
  • [ ] 能用 du -sh /data/ 查看目录总大小,用 df -h 查看磁盘剩余空间

实践练习

基础题:在 /tmp 下创建以下目录结构:/tmp/myproject/data/raw、/tmp/myproject/data/clean、/tmp/myproject/scripts,用一条 mkdir -p 命令完成。然后在 raw 目录下创建一个空文件 orders.csv,并将它复制到 clean 目录。

进阶题:找出 /var/log 目录下所有大于 10MB 的 .log 文件,并把它们的完整路径和大小输出到 /tmp/large_logs.txt(提示:find + -size + ls -lh)。


#Linux #文件操作 #目录管理 #数据工程 #基础命令