本文档风哥主要介绍Linux rmdir和rm命令的使用方法,包括目录删除、文件删除、强制删除、递归删除等内容,参考Red Hat Enterprise Linux 10官方文档,适合运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
参考Red Hat Enterprise Linux 10官方文档中的System administration章节
Part01-基础概念与理论知识
1.1 删除命令基本概念
rmdir和rm是Linux系统中用于删除目录和文件的命令,使用时需要特别小心,因为删除操作通常不可逆。
- rmdir:删除空目录
- rm:删除文件和目录
- 强制删除:不提示确认直接删除
- 递归删除:删除目录及其所有内容
1.2 rmdir与rm的区别
1. rmdir命令
– 只能删除空目录
– 更安全,不会误删文件
– 不支持递归删除非空目录
– 适合删除确认是空的目录
2. rm命令
– 可以删除文件和目录
– 功能更强大,但也更危险
– 支持递归删除(-r选项)
– 支持强制删除(-f选项)
3. 使用场景对比
删除空目录:
rmdir empty_dir # 推荐
rm -d empty_dir # 也可以
删除非空目录:
rmdir non_empty_dir # 失败
rm -r non_empty_dir # 成功
删除文件:
rmdir file.txt # 失败
rm file.txt # 成功
1.3 删除命令选项
rmdir命令选项: 学习交流加群风哥微信: itpux-com
- -p:递归删除空目录
- -v:显示删除过程
- –ignore-fail-on-non-empty:忽略非空目录错误
rm命令选项: 更多学习教程公众号风哥教程itpux_com from LinuxDBA视频:www.itpux.com
- -r/-R:递归删除目录及其内容
- -f:强制删除,不提示确认
- -i:删除前确认
- -v:显示删除过程
- -d:删除空目录
- –preserve-root:不删除根目录(默认)
Part02-生产环境规划与建议
2.1 删除安全策略
1. 删除前确认
– 使用ls命令查看要删除的内容
– 使用绝对路径避免误删
– 重要数据先备份再删除
2. 使用交互模式
– 设置alias rm=’rm -i’
– 删除前系统会提示确认
– 特别适合新手和生产环境
3. 避免危险命令
– 不要使用 rm -rf /
– 不要使用 rm -rf /*
– 不要在变量未定义时使用 rm -rf $VAR/
4. 使用安全删除工具
– trash-cli:将文件移到回收站
– gvfs-trash:GNOME回收站工具
– 自定义脚本:先移动到临时目录
5. 权限控制
– 重要目录设置不可修改属性
– 使用chattr +i锁定关键文件
– 限制rm命令的使用权限
2.2 最佳实践建议
删除操作的最佳实践: 学习交流加群风哥QQ113257174
- 先备份:重要数据删除前先备份
- 先查看:使用ls确认要删除的内容
- 使用绝对路径:避免相对路径导致的误删
- 分步删除:先删除文件,再删除目录
- 记录日志:记录删除操作便于审计
2.3 数据恢复方案
1. 预防措施
– 定期备份重要数据
– 使用版本控制系统
– 启用文件系统快照
2. 恢复工具
extundelete:ext3/ext4文件系统恢复
testdisk:分区恢复
photorec:文件恢复
foremost:文件恢复
3. 恢复步骤
# 1. 立即卸载分区,避免数据覆盖
umount /dev/sdb1
# 2. 使用恢复工具
extundelete /dev/sdb1 –restore-all
# 3. 查看恢复的文件
ls -l RECOVERED_FILES/
4. 注意事项
– 删除后立即停止写入
– 不要在原分区安装工具
– 使用只读模式挂载
– 恢复成功率取决于数据覆盖情况
Part03-生产环境项目实施方案
3.1 rmdir命令使用
# 1. 删除空目录
# mkdir empty_dir
# rmdir empty_dir
# ls -ld empty_dir
ls: cannot access ’empty_dir’: No such file or directory
# 2. 删除多个空目录
# mkdir dir1 dir2 dir3
# rmdir dir1 dir2 dir3
# ls -ld dir*
ls: cannot access ‘dir*’: No such file or directory
# 3. 递归删除空目录
# mkdir -p a/b/c/d/e
# rmdir -p a/b/c/d/e
# ls -ld a
ls: cannot access ‘a’: No such file or directory
# 4. 显示删除过程
# mkdir test_dir
# rmdir -v test_dir
rmdir: removing directory, ‘test_dir’
# 5. 忽略非空目录错误
# mkdir non_empty
# touch non_empty/file.txt
# rmdir –ignore-fail-on-non-empty non_empty
# ls -ld non_empty
drwxr-xr-x. 2 root root 4096 Apr 2 16:00 non_empty
# 6. 删除失败示例
# rmdir non_empty
rmdir: failed to remove ‘non_empty’: Directory not empty
# 7. 使用find删除空目录
# find /tmp -type d -empty -delete
# 或
# find /tmp -type d -empty -exec rmdir {} \;
# 8. 删除当前目录下的所有空目录
# find . -type d -empty -delete
3.2 rm命令使用
# 1. 删除文件
# touch file.txt
# rm file.txt
# ls -l file.txt
ls: cannot access ‘file.txt’: No such file or directory
# 2. 删除多个文件
# touch file1.txt file2.txt file3.txt
# rm file1.txt file2.txt file3.txt
# 3. 删除前确认
# touch important.txt
# rm -i important.txt
rm: remove regular empty file ‘important.txt’? y
# 4. 强制删除
# touch readonly.txt
# chmod 444 readonly.txt
# rm readonly.txt
rm: remove write-protected regular empty file ‘readonly.txt’? y
# rm -f readonly.txt
# 不提示直接删除
# 5. 显示删除过程
# touch file1 file2 file3
# rm -v file1 file2 file3
removed ‘file1’
removed ‘file2’
removed ‘file3’
# 6. 删除空目录
# mkdir empty_dir
# rm -d empty_dir
# 7. 递归删除目录
# mkdir -p test_dir/sub_dir
# touch test_dir/file1.txt test_dir/sub_dir/file2.txt
# rm -r test_dir
# 8. 强制递归删除
# mkdir -p protected_dir
# chmod 000 protected_dir
# rm -rf protected_dir
# 9. 使用通配符删除
# touch log1.txt log2.txt log3.txt
# rm log*.txt
# 10. 删除隐藏文件
# touch .hidden_file
# rm .hidden_file
# 删除所有隐藏文件(不包括.和..)
# rm .[!.]*
# 11. 删除除特定文件外的所有文件
# touch file1.txt file2.txt file3.txt important.txt
# rm !(important.txt) # 需要启用extglob
# shopt -s extglob
# rm !(important.txt)
# 12. 查看删除的文件数量
# touch file{1..100}
# rm -v file* | wc -l
100
3.3 实用案例
# 案例1:安全删除脚本
# cat > /usr/local/bin/safe_rm.sh << 'EOF'
#!/bin/bash
TRASH_DIR="/tmp/trash_$(date +%Y%m%d)"
# 创建回收站目录
mkdir -p "$TRASH_DIR"
for item in "$@"; do
if [ -e "$item" ]; then
# 获取绝对路径和文件名
ABS_PATH=$(realpath "$item")
BASE_NAME=$(basename "$item")
# 移动到回收站
mv "$ABS_PATH" "$TRASH_DIR/${BASE_NAME}_$(date +%H%M%S)"
echo "已移动到回收站: $TRASH_DIR/${BASE_NAME}_$(date +%H%M%S)"
else
echo "文件不存在: $item"
fi
done
echo "回收站位置: $TRASH_DIR"
EOF
# chmod +x /usr/local/bin/safe_rm.sh
# 案例2:清理旧文件
# cat > /usr/local/bin/clean_old_files.sh << 'EOF'
#!/bin/bash
DIR=$1
DAYS=${2:-30}
if [ -z "$DIR" ]; then
echo "用法: $0 <目录> [天数]”
exit 1
fi
echo “清理 $DIR 中超过 $DAYS 天的文件…”
# 查看要删除的文件
find “$DIR” -type f -mtime +$DAYS -ls
# 确认删除
read -p “确认删除以上文件?(y/N): ” confirm
if [ “$confirm” == “y” ] || [ “$confirm” == “Y” ]; then
find “$DIR” -type f -mtime +$DAYS -delete
echo “清理完成!”
else
echo “取消删除”
fi
EOF
# chmod +x /usr/local/bin/clean_old_files.sh
# 案例3:批量删除空目录
# cat > /usr/local/bin/remove_empty_dirs.sh << 'EOF'
#!/bin/bash
DIR=$1
if [ -z "$DIR" ]; then
echo "用法: $0 <目录>”
exit 1
fi
echo “查找并删除 $DIR 中的空目录…”
# 查找空目录
EMPTY_DIRS=$(find “$DIR” -type d -empty)
if [ -z “$EMPTY_DIRS” ]; then
echo “没有找到空目录”
exit 0
fi
echo “找到以下空目录:”
echo “$EMPTY_DIRS”
# 确认删除
read -p “确认删除以上目录?(y/N): ” confirm
if [ “$confirm” == “y” ] || [ “$confirm” == “Y” ]; then
find “$DIR” -type d -empty -delete
echo “删除完成!”
else
echo “取消删除”
fi
EOF
# chmod +x /usr/local/bin/remove_empty_dirs.sh
Part04-生产案例与实战讲解
4.1 案例1:安全删除空目录
# 场景:清理项目中的空目录
# 1. 创建测试环境
# mkdir -p project/{src,bin,lib,docs}/{main,test}
# touch project/src/main/main.c
# touch project/src/test/test.c
# 2. 查找空目录
# find project -type d -empty
project/bin/main
project/bin/test
project/lib/main
project/lib/test
project/docs/main
project/docs/test
# 3. 安全删除空目录(先查看)
# find project -type d -empty -print
project/bin/main
project/bin/test
project/lib/main
project/lib/test
project/docs/main
project/docs/test
# 确认后再删除
# find project -type d -empty -delete
# 4. 使用rmdir递归删除
# mkdir -p a/b/c/d/e
# rmdir -p a/b/c/d/e
# 5. 删除目录树中的空目录
# cat > /usr/local/bin/clean_empty_dirs.sh << 'EOF'
#!/bin/bash
ROOT_DIR=$1
if [ -z "$ROOT_DIR" ]; then
echo "用法: $0 <根目录>”
exit 1
fi
echo “清理 $ROOT_DIR 中的空目录…”
# 循环删除直到没有空目录
while true; do
EMPTY_COUNT=$(find “$ROOT_DIR” -type d -empty | wc -l)
if [ $EMPTY_COUNT -eq 0 ]; then
echo “没有更多空目录”
break
fi
echo “找到 $EMPTY_COUNT 个空目录,正在删除…”
find “$ROOT_DIR” -type d -empty -delete
done
echo “清理完成!”
EOF
# chmod +x /usr/local/bin/clean_empty_dirs.sh
# clean_empty_dirs.sh project
4.2 案例2:批量删除文件
# 场景:清理日志文件和临时文件
# 1. 删除旧日志文件
# find /var/log -type f -name “*.log” -mtime +30 -exec rm -v {} \;
# 2. 删除大文件
# find /data -type f -size +100M -exec rm -v {} \;
# 3. 删除特定扩展名的文件
# find /tmp -type f -name “*.tmp” -delete
# 4. 删除临时文件
# cat > /usr/local/bin/clean_temp.sh << 'EOF'
#!/bin/bash
echo "清理临时文件..."
# 清理/tmp目录中超过7天的文件
find /tmp -type f -mtime +7 -delete
find /tmp -type d -empty -delete
# 清理用户临时文件
find /home -type f -name "*.tmp" -mtime +1 -delete
find /home -type f -name "*.bak" -mtime +7 -delete
# 清理缓存文件
find /var/cache -type f -mtime +30 -delete
echo "临时文件清理完成!"
EOF
# chmod +x /usr/local/bin/clean_temp.sh
# 5. 批量删除并记录日志
# cat > /usr/local/bin/rm_with_log.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/deletion.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
for item in "$@"; do
if [ -e "$item" ]; then
# 记录删除信息
echo "[$TIMESTAMP] $(whoami) deleted: $item ($(du -sh "$item" 2>/dev/null | cut -f1))” >> “$LOG_FILE”
# 执行删除
rm -rf “$item”
echo “已删除: $item”
else
echo “文件不存在: $item”
fi
done
EOF
# chmod +x /usr/local/bin/rm_with_log.sh
# 6. 按模式批量删除
# cat > /usr/local/bin/rm_pattern.sh << 'EOF'
#!/bin/bash
DIR=$1
PATTERN=$2
if [ -z "$DIR" ] || [ -z "$PATTERN" ]; then
echo "用法: $0 <目录> <模式>”
exit 1
fi
echo “在 $DIR 中查找匹配 $PATTERN 的文件…”
# 查看匹配的文件
find “$DIR” -type f -name “$PATTERN” -ls
# 确认删除
read -p “确认删除以上文件?(y/N): ” confirm
if [ “$confirm” == “y” ] || [ “$confirm” == “Y” ]; then
find “$DIR” -type f -name “$PATTERN” -delete
echo “删除完成!”
else
echo “取消删除”
fi
EOF
# chmod +x /usr/local/bin/rm_pattern.sh
4.3 案例3:清理临时文件
# 场景:定期清理系统临时文件
# 1. 创建清理脚本
# cat > /usr/local/bin/system_cleanup.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/cleanup.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
log_message() {
echo "[$TIMESTAMP] $1" | tee -a "$LOG_FILE"
}
log_message "========================================="
log_message "开始系统清理"
log_message "========================================="
# 1. 清理/tmp目录
log_message "清理/tmp目录..."
BEFORE=$(du -sh /tmp | cut -f1)
find /tmp -type f -mtime +7 -delete 2>/dev/null
find /tmp -type d -empty -delete 2>/dev/null
AFTER=$(du -sh /tmp | cut -f1)
log_message “/tmp: $BEFORE -> $AFTER”
# 2. 清理日志文件
log_message “清理旧日志文件…”
find /var/log -type f -name “*.log” -mtime +30 -delete 2>/dev/null
find /var/log -type f -name “*.log.*” -mtime +7 -delete 2>/dev/null
# 3. 清理包管理器缓存
log_message “清理包管理器缓存…”
dnf clean all 2>/dev/null
# 4. 清理旧内核
log_message “清理旧内核…”
CURRENT_KERNEL=$(uname -r)
KERNELS=$(rpm -q kernel | grep -v “$CURRENT_KERNEL” | sort -V | head -n -2)
for kernel in $KERNELS; do
log_message “删除旧内核: $kernel”
dnf remove -y “$kernel” 2>/dev/null
done
# 5. 清理孤儿包
log_message “清理孤儿包…”
dnf autoremove -y 2>/dev/null
# 6. 清理用户缓存
log_message “清理用户缓存…”
find /home -type d -name “.cache” -exec du -sh {} \; 2>/dev/null
find /home -type f -path “*/.cache/*” -mtime +30 -delete 2>/dev/null
# 7. 清理缩略图缓存
log_message “清理缩略图缓存…”
find /home -type f -path “*/.cache/thumbnails/*” -delete 2>/dev/null
# 8. 清理回收站
log_message “清理回收站…”
find /home -type f -path “*/.local/share/Trash/*” -mtime +30 -delete 2>/dev/null
# 9. 显示磁盘空间
log_message “磁盘空间使用情况:”
df -h | grep -E “^/dev|Filesystem” | tee -a “$LOG_FILE”
log_message “=========================================”
log_message “系统清理完成”
log_message “=========================================”
EOF
# chmod +x /usr/local/bin/system_cleanup.sh
# 2. 配置定时任务
# cat > /etc/cron.daily/system-cleanup << 'EOF'
#!/bin/bash
/usr/local/bin/system_cleanup.sh
EOF
# chmod +x /etc/cron.daily/system-cleanup
# 3. 手动执行清理
# /usr/local/bin/system_cleanup.sh
=========================================
开始系统清理
=========================================
清理/tmp目录...
/tmp: 50M -> 10M
清理旧日志文件…
清理包管理器缓存…
清理旧内核…
清理孤儿包…
清理用户缓存…
清理缩略图缓存…
清理回收站…
磁盘空间使用情况:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 90G 15G 75G 17% /
/dev/sda1 1014M 285M 730M 29% /boot
=========================================
系统清理完成
=========================================
Part05-风哥经验总结与分享
5.1 删除命令总结
- rmdir:仅删除空目录,更安全
- rm -r:递归删除目录及其内容
- rm -f:强制删除,不提示确认
- rm -i:交互模式,删除前确认
- 安全第一:删除前务必确认,重要数据先备份
5.2 常见问题解决
# 问题1: 权限不足
# rm file.txt
rm: cannot remove ‘file.txt’: Permission denied
# 解决方法:
sudo rm file.txt
# 或修改权限
chmod 777 file.txt && rm file.txt
# 问题2: 目录非空
# rmdir non_empty
rmdir: failed to remove ‘non_empty’: Directory not empty
# 解决方法:
rm -r non_empty
# 或先清空目录
find non_empty -delete
# 问题3: 文件名包含特殊字符
# rm -rf file name with spaces
rm: cannot remove ‘file’: No such file or directory
rm: cannot remove ‘name’: No such file or directory
rm: cannot remove ‘with’: No such file or directory
rm: cannot remove ‘spaces’: No such file or directory
# 解决方法:
rm -rf “file name with spaces”
rm -rf file\ name\ with\ spaces
# 问题4: 删除太多文件(参数过长)
# rm -rf *.log
bash: /bin/rm: Argument list too long
# 解决方法:
find . -name “*.log” -delete
# 或
find . -name “*.log” | xargs rm
# 问题5: 误删重要文件
# 预防措施:
# 1. 设置alias
alias rm=’rm -i’
# 2. 使用安全删除工具
alias rm=’/usr/local/bin/safe_rm.sh’
# 3. 重要文件设置不可删除属性
chattr +i important_file
5.3 实用技巧
# 1. 创建安全删除别名
alias rm=’rm -i’
alias rmdir=’rmdir -v’
alias del=’/usr/local/bin/safe_rm.sh’
# 2. 查看将要删除的文件
alias rm-dry=’find . -name’
# 3. 删除文件并显示进度
rm -rv directory
# 4. 删除文件并统计数量
rm -rv directory | grep “^removed” | wc -l
# 5. 删除文件并保存列表
rm -rv directory | tee deleted_files.log
# 6. 使用find删除时排除特定文件
find . -type f -name “*.log” ! -name “important.log” -delete
# 7. 删除空行
sed -i ‘/^$/d’ file.txt
# 8. 删除重复行
sort file.txt | uniq > unique.txt
# 9. 删除特定行
sed -i ‘1,5d’ file.txt # 删除第1-5行
sed -i ‘/pattern/d’ file.txt # 删除匹配pattern的行
# 10. 安全删除脚本
safe_delete() {
local target=$1
local backup_dir=”/tmp/deleted_$(date +%Y%m%d)”
mkdir -p “$backup_dir”
if [ -e “$target” ]; then
mv “$target” “$backup_dir/”
echo “已移动到: $backup_dir/$(basename $target)”
else
echo “文件不存在: $target”
fi
}
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
