Linux 文件与目录命令速查
更新时间:2026-08-28。本文是 Linux 命令速查主题第①族:文件与目录,约 33 个命令。文件系统是 Linux 一切操作的基础——配置、日志、数据、可执行文件,本质上都是文件。这一族命令使用频率最高,也最值得练到不用想。深入原理见 VFS 与文件系统。
一、路径与浏览
刚接触 Linux 时最容易迷路的是"我现在到底在哪"。pwd 回答这个问题,cd 负责移动,ls 负责看清周围有什么。这三个是使用频率最高的命令,熟练之后基本是肌肉记忆。
| 命令 | 作用 | 常用示例 |
|---|---|---|
| pwd | 打印当前工作目录的绝对路径 | pwd |
| cd | 切换目录 | cd /var/log;cd ..;cd ~(回家目录);cd -(回到上一个目录,来回切很方便) |
| ls | 列出目录内容 | ls -l(长格式);ls -a(含隐藏文件);ls -lh(人类可读大小);ls -lt(按时间倒序);ls -R(递归);ls -i(显示 inode) |
| tree | 树状显示目录结构,看项目骨架很直观 | tree -L 2(只显示 2 层);tree -d(只列目录);tree -h(带文件大小) |
| stat | 显示文件详细状态,含大小、权限、三个时间戳与 inode 号 | stat file.txt;stat -f /(看文件系统信息) |
| file | 探测文件真实类型(不靠扩展名,而是读文件头) | file /bin/ls → ELF 64-bit ...;file unknown.bin |
Linux 里扩展名只是命名习惯,系统判断文件类型靠的是文件头内容。file 命令就是读这些"魔数"(magic number)来识别的,所以一个没有扩展名的文件它也能认出来是 PNG 还是 ELF。遇到"这个文件打不开"时,先 file 一下确认它到底是什么。
二、创建与删除
创建看似简单,但 mkdir 不加 -p 在多级目录时会直接报错,rm 不加 -r 删不掉目录——这两个是新手最常碰到的报错来源。另外批量建目录时用 mkdir -p 比先判断再建要干净得多。
| 命令 | 作用 | 常用示例 |
|---|---|---|
| mkdir | 创建目录 | mkdir -p a/b/c(递归创建,不存在则全建);mkdir -m 755 dir(创建时指定权限) |
| rmdir | 删除空目录(非空会报错,这是它的"安全"之处) | rmdir emptydir |
| touch | 创建空文件,或更新已有文件的时间戳 | touch newfile;touch -d "2026-08-25 12:00" f(指定时间);touch -r src dst(复制 src 的时间戳) |
| rm | 删除文件或目录 | rm file.txt;rm -r dir(递归删目录);rm -f(强制不提示);rm -i(逐项确认) |
| shred | 安全覆写删除,多次覆写后删除,防恢复 | shred -u file(覆写后删除);shred -n 3 -u file(覆写 3 次) |
| mktemp | 创建唯一的临时文件/目录,避免并发脚本互相踩踏 | mktemp(创建临时文件);mktemp -d(临时目录);tmp=$(mktemp);mktemp -p /var/tmp(指定目录) |
install | 复制文件并设置权限/属主,一条命令完成"拷贝+改权限",Makefile 里常用 | install -m 755 app /usr/local/bin/;install -d /opt/app(建目录);install -o user -g group src dst |
安全提示:
rm -rf是 Linux 上最危险的组合之一。删除前先 ls 确认;脚本里写rm -rf "$VAR"前务必校验变量非空,一个手滑的空格就可能让它变成rm -rf / some_dir。临时文件一律用 mktemp 生成,别手写/tmp/myapp.tmp——两个实例同时跑就会互相覆盖。
三、复制、移动与链接
软链接(symbolic link)和硬链接(hard link)的区别值得花两分钟弄清:软链接是个独立的小文件,里面存着目标路径,目标删了它就变成"断链";硬链接是同一个 inode 的另一个名字,删掉其中一个名字,数据还在,只有所有名字都删掉数据才真正释放。
| 命令 | 作用 | 常用示例 |
|---|---|---|
| cp | 复制文件或目录 | cp src dst;cp -r srcdir dstdir(递归);cp -p(保留权限/时间戳);cp -a(归档模式,等价于 -rpP);cp -u(只复制更新的) |
| mv | 移动或重命名(同一文件系统内是改目录项,很快) | mv a b(重命名);mv file dir/(移动);mv -i(覆盖前确认);mv -n(不覆盖已存在的) |
| ln | 创建链接 | ln -s target linkname(软链接);ln target linkname(硬链接);ln -sf(强制覆盖已有链接) |
| readlink | 读取软链接指向的路径 | readlink -f /usr/bin/python(解析出最终真实路径,可穿透多层链接) |
| realpath | 输出规范化的绝对路径(解析 .、.. 与软链接) | realpath ./file;realpath -e missing(不存在时报错) |
| basename | 取路径的文件名部分 | basename /a/b/c.sh → c.sh;basename /a/b/c.sh .sh → c(去掉后缀) |
| dirname | 取路径的目录部分 | dirname /a/b/c.sh → /a/b |
| rename | 批量重命名(Perl 正则) | rename 's/\.txt$/.md/' *.txt;rename -n(演练,只看会改什么) |
ln -s最常见的坑是用了相对路径:软链接里存的就是你写的那个字符串,之后把链接文件移到别处,相对路径就指错了。稳妥做法是用绝对路径创建,或者保证链接和目标始终在同一目录。cp -a在备份目录时比cp -r更可靠,它会连权限、时间戳、链接一起保留。
四、查找与定位
find 是这一族里最强大的,它的 -exec 能把查找和处理串成一条命令。locate 则相反:它查的是预先建好的索引数据库,快但不是实时的——刚建的文件要等 updatedb 之后才能找到。
| 命令 | 作用 | 常用示例 |
|---|---|---|
| find | 按名称、类型、大小、时间、权限等条件查找文件 | find /var -name "*.log";find . -type f -size +100M(大于 100M);find . -mtime -7(7 天内修改);find . -perm 644;find . -name "*.tmp" -delete;find . -type f -exec chmod 644 {} \; |
| locate | 按索引数据库快速定位,速度快但结果可能不是最新 | locate nginx.conf;sudo updatedb(更新索引);locate -i(忽略大小写) |
| which | 在 $PATH 中定位可执行命令的路径 | which python3;which -a python(列出所有匹配) |
| whereis | 查找命令的二进制、源码与手册页位置 | whereis ls;whereis -b python(只看二进制) |
| type | 显示命令类型:别名、Shell 内建还是外部程序 | type -a ls(列出所有同名);type cd(会告诉你 cd 是内建) |
find 处理大量结果时,
-exec cmd {} \;会对每个文件起一个进程,慢;换成-exec cmd {} +会批量传参,快很多。更现代的写法是find ... -print0 | xargs -0 cmd——用\0分隔能正确处理文件名里的空格,这是-exec也容易翻车的地方。判命令是否存在用command -v更规范,见 Shell 内建命令。
五、权限与属性
Linux 的权限分三组:属主(user)、属组(group)、其他人(others),每组三个位——读(r)、写(w)、执行(x)。chmod 755 这种数字写法,本质就是把三组权限各用一个八进制数字表示。除了这九个位,还有三个特殊位以及独立于权限体系之外的文件属性。
| 命令 | 作用 | 常用示例 |
|---|---|---|
| chmod | 修改文件权限 | chmod 755 script.sh;chmod u+x file(属主加执行);chmod -R 755 dir/(递归);chmod u+s file(设置 SUID 位) |
| chown | 修改属主与属组 | chown user:group file;chown -R user dir/(递归);chown :group file(只改组) |
| chgrp | 只修改属组 | chgrp staff file;chgrp -R www-data /var/www |
| umask | 设置新建文件/目录的默认权限掩码 | umask 022(新文件 644、新目录 755);umask(查看当前值);umask -S(符号形式显示) |
lsattr / chattr | 查看/修改文件扩展属性(独立于 chmod 之外的另一层控制) | chattr +i file(不可删除/修改,root 也拦);chattr +a file(只能追加,日志防篡改常用);lsattr file;chattr -i file(解除) |
权限数字速记:
r=4 w=2 x=1,755 = rwxr-xr-x。umask 是"要扣掉的权限"而非"要赋予的"——umask 022意味着从默认的 666/777 里扣掉组和其他人的写权限,得到 644/755。详细原理见 VFS 与权限。
六、ACL 精细权限
标准的九位权限只能区分"属主、属组、其他人"三类。如果你想让"用户 A 和 B 都能写这个文件,但 C 不行,同时其他人只读"——传统权限做不到,这就需要 ACL(Access Control List,访问控制列表)出马了。它能给任意指定用户或组单独授权。
| 命令 | 作用 | 常用示例 |
|---|---|---|
setfacl | 设置 ACL,给指定用户/组单独授权,也可设默认继承规则 | setfacl -m u:alice:rw file(给 alice 读写);setfacl -m g:dev:rwx dir/;setfacl -d -m u:alice:rwx dir/(目录默认继承);setfacl -x u:alice file(删除单条);setfacl -b file(清空所有 ACL) |
getfacl | 查看 ACL 规则,权限用 + 标记的文件说明配了 ACL | getfacl file;getfacl -R dir/(递归查看) |
配了 ACL 的文件,
ls -l的权限位末尾会多一个+号(如-rw-rw-r--+)。看到这个加号就知道要去getfacl看真实权限,只盯着ls -l输出会误判。注意 ACL 需要文件系统挂载时开启acl选项,现代文件系统(ext4、XFS)默认都已支持。
七、文件变化监控
想知道"这个文件什么时候被谁改了",或者"某个目录下的文件一出现就立刻处理"——轮询太笨,内核提供的 inotify 机制才是正解。它能让进程订阅文件系统事件,实时得到通知。
| 命令 | 作用 | 常用示例 |
|---|---|---|
inotifywait | 等待并输出文件系统事件,常用于"文件一变化就触发动作"的脚本 | inotifywait -m /data(持续监控);inotifywait -m -e create,modify /data(只关注指定事件);inotifywait -r -e close_write /src(递归,等待写入完成) |
inotifywatch | 统计一段时间内文件系统事件的发生次数,用于分析"谁在频繁读写" | inotifywatch -v -t 60 /data(统计 60 秒) |
典型用法是配合 while 循环做自动处理:
while inotifywait -e close_write -r /src; do make; done,源码一保存就自动重新构建。close_write(写入完成)比modify(内容变化)更适合触发后续动作——后者在写入过程中会触发多次,前者只在文件写完关闭时触发一次。
一句话总结
文件与目录速查:浏览用 pwd/cd/ls/tree/stat,增删用 mkdir/touch/rm/shred,复制移动用 cp/mv,查找用 find/locate,权限用 chmod/chown/umask,精细授权上 setfacl,防篡改用 chattr +i,实时监控用 inotifywait——33 个命令覆盖日常文件操作 95% 的场景。