在Linux操作系统中,文件和目录的管理是日常运维和开发的核心任务。主要包括touch
、mkdir
、rmdir
、rm
、cp
、mv
、tar
等核心命令。
核心命令详解与案例
1. touch
:创建空文件或更新文件时间戳
作用:创建空文件或更新文件的访问和修改时间。
基本语法:
touch [选项]... 文件...
常用选项
-a
:仅更改访问时间(access time)-c
:不创建新文件(文件不存在时不新建)-d
:使用指定字符串表示时间而非当前时间-m
:仅更改修改时间(modification time)-r
:使用参考文件的时间-t
:使用指定时间戳格式-h
:影响符号链接本身而非链接目标(仅限能更改符号链接的系统)
案例:
- 创建空文件file1.txt和file2.log。
- 更新file1.txt的时间戳(不修改内容)。
touch file1.txt file2.log # 创建空文件file1.txt和file2.log
ls -l
# -rw-r--r-- 1 root root 0 6月 14 19:13 file1.txt
# -rw-r--r-- 1 root root 0 6月 14 19:13 file2.log
touch file1.txt # 更新file1.txt的时间戳(不修改内容)
ls -l
# -rw-r--r-- 1 root root 0 6月 14 19:15 file1.txt
# -rw-r--r-- 1 root root 0 6月 14 19:13 file2.log
解析:
touch
默认创建空文件,若文件已存在则更新时间戳。- 使用
ls -l
可验证时间戳是否更新。
2. mkdir
:创建目录
作用:创建新目录。 基本语法:
mkdir [选项] 目录名...
常用选项:
-p
:递归创建多级目录。-m
:设置目录权限模式(类似chmod
)-v
:显示详细的创建过程信息
案例:
- 创建单级目录dir1
- 递归创建多级目录dir2/subdir
mkdir dir1
ls -l
# drwxr-xr-x 2 root root 6 6月 14 19:23 dir1
mkdir -p dir2/subdir
ls -R dir2
# .:
# dir1 dir2
# ./dir1:
# ./dir2:
# subdir
# ./dir2/subdir:
解析:
-p
选项可避免因父目录不存在而报错。- 使用
ls -R
查看目录及子目录结构结构。
3. rmdir
:删除空目录
作用:删除空目录。 基本语法:
rmdir [选项] 目录名...
常用选项:
-p
:递归删除目录(删除目录及其空的父目录)--ignore-fail-on-non-empty
:忽略因目录非空导致的错误-v
:显示详细的删除过程信息
注意:仅能删除空目录。
案例:
- 删除空目录dir1
- 尝试删除非空目录dir2(报错)
rmdir dir1 # 删除空目录dir1
ls -l # dir1已被删除
rmdir dir 2# 尝试删除非空目录dir2(报错)
#rmdir: failed to remove 'dir2': Directory not empty
解析:rmdir
仅适用于空目录,非空目录需使用rm -r
。
4. rm
:删除文件或目录
作用:删除文件或目录。 基本语法:
rm [选项]... 文件或目录...
常用选项:
-f
:强制删除,忽略不存在的文件和警告,不提示确认。-i
:交互式删除,删除前提示确认-r
或-R
:递归删除目录及其内容-d
:删除空目录(类似rmdir
)-v
:显示详细操作信息--no-preserve-root
:不特殊处理根目录/
--preserve-root
:禁止递归删除根目录(默认行为)
案例:
- 删除文件file1.txt
- 递归删除目录dir2及其内容
- 强制删除文件(不提示)
rm file1.txt # 删除文件file1.txt
ls -l # file1.txt已被删除
rm -r dir2 # 递归删除目录dir2及其内容
ls -l # dir2已被删除
rm -f file2.log # 强制删除文件(不提示)
ls -l # file2.log已被删除
解析:
-r
:递归删除目录及其内容。-f
:强制删除,不提示确认。- 删除操作不可逆,需谨慎。
5. cp
:复制文件或目录
作用:复制文件或目录。 基本语法:
cp [选项]... 源文件 目标文件
cp [选项]... 源文件... 目标目录
常用选项:
-a
:归档模式,相当于-dR --preserve=all
-i
:覆盖前提示确认-n
:不覆盖已存在文件-r
:递归复制目录-u
:只复制源文件中更新时间较新的文件-v
:显示复制过程-p
:保留原始文件的属性(权限、时间戳等)-f
:强制覆盖已存在文件-l
:创建硬链接而非复制文件-s
:创建符号链接而非复制文件--backup
:覆盖前备份已存在文件
案例:
- 创建空文件file2.log。
- 复制文件file2.log为file2_copy.log
- 递归创建多级目录dir1/subdir
- 在dir1/subdir目录中创建空文件file3.txt
- 递归复制目录dir1及其内容为dir1_copy
- 递归查看dir1_copy目录
touch file2.log
cp file2.log file2_copy.log # 复制文件file2.log为file2_copy.log
ls -l
# -rw-r--r-- 1 root root 0 6月 14 19:53 file2_copy.log
# -rw-r--r-- 1 root root 0 6月 14 19:53 file2.log
# 递归复制目录dir1及其内容为dir1_copy
mkdir -p dir1/subdir # 递归创建多级目录dir1/subdir
touch dir1/subdir/file3.txt # 在dir1/subdir目录中创建空文件file3.txt
cp -r dir1 dir1_copy # 递归复制目录dir1及其内容为dir1_copy
ls -R dir1_copy
# dir1_copy:
# subdir
# dir1_copy/subdir:
# file3.txt
解析:-r
用于复制目录,-v
可显示复制过程(如cp -rv dir1 dir1_copy
)。
6. mv
:移动或重命名文件/目录
作用:移动文件或目录,或重命名文件/目录。 基本语法:
mv [选项]... 源文件 目标文件
mv [选项]... 源文件... 目标目录
常用选项:
-i
:覆盖前提示确认-n
:不覆盖已存在文件-v
:显示详细操作信息-u
:只移动源文件中更新时间较新的文件-f
:强制覆盖已存在文件-b
:覆盖前为目标文件创建备份-S
:指定备份文件的后缀--backup
:覆盖前备份已存在文件
案例:
- 重命名文件file2_copy.log为file2_renamed.log
- 移动目录dir1_copy到dir_moved
mv file2_copy.log file2_renamed.log # 重命名文件file2_copy.log为file2_renamed.log
ls -l
# -rw-r--r-- 1 root root 0 6月 14 19:53 file2_renamed.log
mv dir1_copy dir_moved # 移动目录dir1_copy到dir_moved
ls -l
# drwxr-xr-x 3 root root 20 6月 14 19:55 dir_moved
解析:mv
可同时实现重命名和移动操作。
7. tar
:打包与解包文件/目录
作用:将多个文件或目录打包为一个归档文件,或解包归档文件。 基本语法:
tar [选项] [归档文件] [文件或目录...]
常用选项:
-c
:创建归档文件。-x
:解包归档文件。-f
:指定归档文件名(必须选项)-v
:显示详细处理过程-z
:通过 gzip 压缩/解压-j
:通过 bzip2 压缩/解压-J
:通过 xz 压缩/解压-C
:解压到指定目录-p
:保留文件权限属性--exclude
:排除指定模式的文件-h
:跟随符号链接(归档链接指向的文件)-P
:保留绝对路径(谨慎使用)
案例:
- 打包目录dir_moved为archive.tar
- 使用gzip压缩打包为archive.tar.gz
- 解包archive.tar到extracted目录
- 解压archive.tar.gz到extracted_gz目录
# 打包目录dir_moved为archive.tar
tar -cvf archive.tar dir_moved
# dir_moved/
# dir_moved/subdir/
# dir_moved/subdir/file3.txt
# 使用gzip压缩打包为archive.tar.gz
tar -czvf archive.tar.gz dir_moved
# dir_moved/
# dir_moved/subdir/
# dir_moved/subdir/file3.txt
# 解包archive.tar到extracted目录
mkdir extracted
tar -xvf archive.tar -C extracted
# dir_moved/
# dir_moved/subdir/
# dir_moved/subdir/file3.txt
# 解压archive.tar.gz到extracted_gz目录
mkdir extracted_gz
tar -xzvf archive.tar.gz -C extracted_gz
# dir_moved/
# dir_moved/subdir/
# dir_moved/subdir/file3.txt
解析:
-c
创建归档,-x
解包,-v
显示过程,-f
指定文件名。-z
和-j
分别用于gzip和bzip2压缩。
常见错误及解决方法
错误:rmdir: Directory not empty
原因:尝试删除非空目录。
解决方法:使用rm -r
递归删除。
错误:rm: cannot remove 'file': Permission denied
原因:无权限删除文件。
解决方法:使用sudo rm -f file
或切换到有权限的用户。
错误:cp: omitting directory 'dir'
原因:未使用-r
选项尝试复制目录。
解决方法:使用cp -r dir dir_copy
。
错误:tar: Removing leading '/' from member names
原因:打包时使用了绝对路径(如/home/alice/dir
)。
解决方法:切换到目标目录或使用相对路径。
错误:tar: Error is not recoverable: exiting now
原因:归档文件损坏或路径错误。
解决方法:检查归档文件完整性或路径是否正确。
理论练习
问答题:rm -r
和rmdir
的区别是什么?
答案
rm -r
:递归删除目录及其内容(包括非空目录)。rmdir
:仅能删除空目录。
问答题:tar -czvf
中的-c
、-z
、-v
、-f
分别表示什么?
答案
-c
:创建归档。-z
:使用gzip压缩。-v
:显示操作过程。-f
:指定归档文件名。
问答题:mv
命令能否同时实现重命名和移动操作?
答案:可以。例如mv file1.txt dir/file2.txt
既重命名又移动。
问答题:如果要打包一个目录并排除其中的某些文件,如何操作?
答案:使用tar
的--exclude
选项。
例如:
tar -czvf archive.tar.gz --exclude='*.tmp' --exclude='temp/' dir_to_pack
问答题:cp
命令的-u
选项有什么作用?
答案:-u
仅在源文件比目标文件新或目标文件不存在时复制。
实操练习
练习:创建空文件test1.txt
和test2.log
,并更新test1.txt
的时间戳。
答案
touch test1.txt test2.log
ls -l
# -rw-r--r-- 1 root root 0 6月 15 10:52 test1.txt
# -rw-r--r-- 1 root root 0 6月 15 10:52 test2.log
sleep 5 # 等待5秒
touch test1.txt
ls -l
# -rw-r--r-- 1 root root 0 6月 15 10:54 test1.txt
# -rw-r--r-- 1 root root 0 6月 15 10:52 test2.log
练习:递归创建目录project/src/main
,并在main
目录下创建空文件app.py
。
答案
mkdir -p project/src/main
touch project/src/main/app.py
ls -R
# .:
# project test1.txt test2.log
# ./project:
# src
# ./project/src:
# main
# ./project/src/main:
# app.py
练习:删除空目录project/src/main
(若非空则先清空)。
答案
rm -r project/src/main # 若main非空
# rm:是否进入目录"project/src/main"? y
# rm:是否删除普通空文件 "project/src/main/app.py"?y
# rm:是否删除目录 "project/src/main"?y
练习:复制test2.log
为test2_backup.log
,并移动到backup
目录(需先创建backup
)。
答案
mkdir backup
cp test2.log test2_backup.log
mv test2_backup.log backup/
ls -R
# .:
# backup project test1.txt test2.log
#./backup:
#test2_backup.log
#./project:
#src
#./project/src:
练习:打包backup
目录为backup.tar.gz
,并解压到backup_extracted
目录。
答案
tar -czvf backup.tar.gz backup
# backup/
# backup/test2_backup.log
mkdir backup_extracted
tar -xzvf backup.tar.gz -C backup_extracted
# backup/
# backup/test2_backup.log
练习:创建一个目录test
,包含文件a.txt
和b.log
,然后打包test
目录为test.tar
,并排除b.log
。
答案
mkdir test
touch test/a.txt test/b.log
tar -cvf test.tar --exclude='b.log' test
# test/
# test/a.txt
练习:将test.tar
解压到test_extracted
目录,并验证b.log
是否被排除。
答案
mkdir test_extracted
tar -xvf test.tar -C test_extracted
# test/
# test/a.txt
ls test_extracted/test # 应只看到a.txt
# a.txt
知识总结
touch
:创建空文件或更新时间戳。mkdir
:创建目录(-p
递归创建)。rmdir
:删除空目录。rm
:删除文件或目录(-r
递归,-f
强制)。cp
:复制文件或目录(-r
递归)。mv
:移动或重命名文件/目录。tar
:打包/解包文件或目录(-c
创建,-x
解包,-z
/-j
压缩)。