Skip to main content

常见文件操作

一、查看目录与文件​

pwd                     ## 当前所在目录
ls ## 列出当前目录内容
ls -l ## 详细信息(权限、属主、大小、时间)
ls -a ## 显示隐藏文件(以 . 开头的)
ls -lh ## 大小带单位(K/M/G)
ls -lt ## 按修改时间倒序
ls -lS ## 按文件大小倒序
ls -R ## 递归列出子目录
ls -ld dir ## 只看目录本身,不看里面

tree 以树形展示目录(需安装:sudo apt install tree):

tree -L 2               ## 只显示 2 层
tree -d ## 只显示目录

二、创建​

touch a.txt             ## 创建空文件;文件已存在则更新时间戳
touch a.txt b.txt ## 一次创建多个
mkdir demo ## 创建目录
mkdir -p /data/app/logs ## 递归创建多级目录,已存在不报错

一句话写入内容:

echo "hello" > a.txt        ## 写入(覆盖原内容)
echo "hello" >> a.txt ## 追加
printf "line1\nline2\n" > b.txt

多行写入:

cat > note.md << 'EOF'
第一行
第二行
EOF

三、查看文件内容​

cat a.txt               ## 全部输出,适合小文件
cat -n a.txt ## 带行号
tac a.txt ## 倒序输出
nl a.txt ## 带行号(空行不编号)

大文件用 less(q 退出,/关键字 搜索,G 到末尾):

less big.log

只看开头/结尾:

head -n 20 a.txt        ## 前 20 行,默认 10 行
tail -n 20 a.txt ## 后 20 行
tail -f app.log ## 实时跟踪日志(Ctrl+C 退出)
tail -F app.log ## 文件被切割/重建后仍能跟踪

统计与信息:

wc -l a.txt             ## 行数
wc -c a.txt ## 字节数
wc -w a.txt ## 单词数
file a.txt ## 文件类型
stat a.txt ## 大小、inode、三个时间戳
du -sh /data ## 目录总占用
du -h --max-depth=1 /data ## 各一级子目录占用

四、复制 cp​

cp a.txt b.txt              ## 文件 → 文件(复制并改名)
cp a.txt /tmp/ ## 文件 → 目录(保留原名)
cp -r demo /tmp/ ## 递归复制目录
cp -p a.txt b.txt ## 保留权限、属主、时间戳
cp -a demo backup/ ## 归档复制,等于 -r + -p + 保留链接
cp -i a.txt b.txt ## 覆盖前询问
cp -u a.txt /tmp/ ## 仅当源更新时才覆盖
cp -v a.txt /tmp/ ## 显示复制过程

示例:复制整个项目到备份目录并保留属性

cp -a /data/www /backup/www-20261017

五、移动 / 重命名 mv​

mv 一条命令同时负责“移动”和“重命名”:

mv a.txt b.txt              ## 重命名
mv a.txt /tmp/ ## 移动到目录
mv -i a.txt b.txt ## 覆盖前询问
mv -n a.txt b.txt ## 目标存在则不覆盖
mv -v a.txt /tmp/ ## 显示过程
mv demo /data/ ## 移动整个目录

六、删除 rm​

rm a.txt                    ## 删除文件
rm -i a.txt ## 删除前确认
rm -r demo ## 递归删除目录
rm -rf demo ## 递归删除且不提示(慎用)
rmdir empty_dir ## 只能删空目录
rm -v *.log ## 删除并显示删除项

rm -rf 不可恢复,执行前先用 ls 确认路径,尤其别在 /、/root、~ 下随手敲。

七、查找​

按名字、类型、时间、大小查找:

find . -name "*.log"                    ## 当前目录下按名字找
find . -iname "*.LOG" ## 忽略大小写
find /var/log -type f ## 只找普通文件(d 目录、l 链接)
find . -type d -name node_modules ## 找目录
find . -mtime -7 ## 7 天内修改过
find . -size +100M ## 大于 100M
find . -name "*.tmp" -delete ## 找到后删除
find . -type f -name "*.sh" -exec chmod +x {} \; ## 找到后执行命令

{} 是文件路径的占位符;\; 表示每个文件单独执行一次,+ 表示尽可能批量执行。

按内容检索(grep):

grep "error" app.log                ## 在文件里找
grep -i "error" app.log ## 忽略大小写
grep -n "error" app.log ## 显示行号
grep -c "error" app.log ## 统计匹配行数
grep -v "debug" app.log ## 反向匹配,排除含 debug 的行
grep -rn "TODO" . ## 递归查找目录并显示行号
grep -rn "TODO" --include="*.py" . ## 只查指定后缀

八、创建链接​

ln -s /data/app/current /var/www/html/app   ## 软链接(推荐)
ln a.txt hard.txt ## 硬链接
ls -l ## 软链接会显示 ->
readlink -f /var/www/html/app ## 查看软链接真实指向

九、压缩与解压​

tar(最常用)​

tar -czvf archive.tar.gz demo/      ## 打包并 gzip 压缩
tar -xzvf archive.tar.gz ## 解压到当前目录
tar -xzvf archive.tar.gz -C /tmp ## 解压到指定目录
tar -tzvf archive.tar.gz ## 只查看内容,不解压
tar -czvf archive.tar.gz a.txt b.txt ## 只打包指定文件
tar -xzvf archive.tar.gz demo/a.txt ## 只解压其中一个文件

选项记忆:c 创建、x 解压、t 查看、z gzip、j bzip2、J xz、v 显示过程、f 指定文件名。

tar -cjf a.tar.bz2 demo/    ## bzip2
tar -cJf a.tar.xz demo/ ## xz

zip / unzip​

zip -r archive.zip demo/        ## 递归压缩目录
zip archive.zip a.txt b.txt ## 压缩指定文件
unzip archive.zip ## 解压到当前目录
unzip archive.zip -d /tmp/x ## 解压到指定目录
unzip -l archive.zip ## 查看内容
unzip -o archive.zip ## 覆盖已有文件不提示

gzip / gunzip​

gzip a.txt          ## 得到 a.txt.gz,原文件会被删除
gzip -k a.txt ## 保留原文件
gunzip a.txt.gz ## 解压
zcat a.txt.gz ## 不解压直接查看

十、常用组合示例​

## 打包今天的日志并删除源文件
tar -czvf logs-$(date +%F).tar.gz /var/log/app/*.log && rm -f /var/log/app/*.log

## 找出 7 天前的日志并逐个压缩(生成 .log.gz)
find /data/logs -name "*.log" -mtime +7 -exec gzip {} \;

## 找出 100M 以上的大文件
find / -type f -size +100M 2>/dev/null

## 备份目录并排除 node_modules
tar -czvf site.tar.gz --exclude='node_modules' /data/site