前言
在 Linux 系统中,文件和目录管理是日常操作的基础技能。本文将结合工作环境来介绍两个命令的功能和用法。(本文将以 Ubuntu 版本示例)
touch命令使用场景
创建一个空文件
//touch文件名则创建一个新的空文件
root@ubuntu:~# touch a.txt
root@ubuntu:~# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 252,0 Inode: 2359307 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-08-06 01:54:27.105681274 +0000
Modify: 2024-08-06 01:54:27.105681274 +0000
Change: 2024-08-06 01:54:27.105681274 +0000
Birth: 2024-08-06 01:54:27.105681274 +0000
更新文件的访问时间和修改时间
//若文件已存在,touch文件名,则更新文件的访问时间和修改时间
root@ubuntu:~# touch a.txt
root@ubuntu:~# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 252,0 Inode: 2359307 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-08-06 01:55:03.437591194 +0000
Modify: 2024-08-06 01:55:03.437591194 +0000
Change: 2024-08-06 01:55:03.437591194 +0000
Birth: 2024-08-06 01:54:27.105681274 +0000
更新链接文件的访问时间和修改时间
// 当使用-h选项时,touch链接文件时,不会更新源文件
root@ubuntu:~# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 252,0 Inode: 2359306 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-08-06 02:19:22.310551437 +0000
Modify: 2024-08-06 02:19:22.310551437 +0000
Change: 2024-08-06 02:19:22.310551437 +0000
Birth: 2024-08-06 02:18:43.357426739 +0000
root@ubuntu:~# touch -h a.txt.link
root@ubuntu:~# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 252,0 Inode: 2359306 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-08-06 02:19:22.310551437 +0000
Modify: 2024-08-06 02:19:22.310551437 +0000
Change: 2024-08-06 02:19:22.310551437 +0000
Birth: 2024-08-06 02:18:43.357426739 +0000
root@ubuntu:~# stat a.txt.link
File: a.txt.link -> a.txt
Size: 5 Blocks: 0 IO Block: 4096 symbolic link
Device: 252,0 Inode: 2359307 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-08-06 02:23:10.436333177 +0000
Modify: 2024-08-06 02:22:55.957894373 +0000
Change: 2024-08-06 02:22:55.957894373 +0000
Birth: 2024-08-06 02:18:57.815842867 +0000
参考文件的时间刷新到目标文件
// 将-r选项后的文件时间刷新到选项前的文件中
root@ubuntu:~# ll *.txt
-rw-r--r-- 1 root root 0 Aug 6 02:19 a.txt
-rw-r--r-- 1 root root 0 Aug 6 02:25 b.txt
root@ubuntu:~# touch a.txt -r b.txt
root@ubuntu:~# ll *.txt
-rw-r--r-- 1 root root 0 Aug 6 02:25 a.txt
-rw-r--r-- 1 root root 0 Aug 6 02:25 b.txt
不创建新文件
// 若文件存在,则更新时间,若文件不存在,也不创建新文件
root@ubuntu:~# ll a.txt
-rw-r--r-- 1 root root 0 Aug 6 02:25 a.txt
root@ubuntu:~# touch -c a.txt
root@ubuntu:~# ll a.txt
-rw-r--r-- 1 root root 0 Aug 6 02:33 a.txt
root@ubuntu:~# touch -c c.txt
root@ubuntu:~# ls
a.txt a.txt.link b.txt
cp命令使用场景
复制文件过程中会覆盖目标文件内容,一般在工作环境中需要先备份(-b选项)再覆盖,或者使用 -i 选项,以免操作错误,丢失数据文件。
文件之间的复制
// 复制文件到当前目录下,也可使用绝对路径复制到其他目录下
root@ubuntu:~# touch a.txt
root@ubuntu:~# ls
a.txt
root@ubuntu:~# cp a.txt abc.txt
root@ubuntu:~# ls
abc.txt a.txt
-i 复制前询问是否文件内容覆盖
// 若需要则输入y按下回车,若不需要覆盖则输入n按下回车
root@ubuntu:~# echo "dayunzi" >a.txt
root@ubuntu:~# cp -i a.txt abc.txt
cp: overwrite 'abc.txt'? y
root@ubuntu:~# cat abc.txt
dayunzi
-u 复制时比较更新时间
// 当源文件更新时间更新时,复制操作不生效
root@ubuntu:~# echo "aaaaaa" >a.txt
root@ubuntu:~# echo "abcabc" >abc.txt
root@ubuntu:~# ll *.txt
-rw-r--r-- 1 root root 7 Aug 6 03:02 abc.txt
-rw-r--r-- 1 root root 7 Aug 6 03:01 a.txt
root@ubuntu:~# cp -u a.txt abc.txt
root@ubuntu:~# cat abc.txt
abcabc
root@ubuntu:~# cp -u abc.txt a.txt
root@ubuntu:~# cat a.txt
abcabc
-b 复制前备份
// 若再一次覆盖同一个文件,备份文件同样会被覆盖为最近一次需要备份的内容
root@ubuntu:~# cp -b a.txt abc.txt
root@ubuntu:~# ls
abc.txt abc.txt~ a.txt
root@ubuntu:~# cat abc.txt
aaaaaa
root@ubuntu:~# cat abc.txt~
abcabc
root@ubuntu:~# touch c.txt
root@ubuntu:~# echo "cccccc" >c.txt
root@ubuntu:~# cp -b c.txt abc.txt
root@ubuntu:~# cat abc.txt~
aaaaaa
复制文件到目录
root@ubuntu:~# mkdir dira
root@ubuntu:~# cp a.txt dira
root@ubuntu:~# ls dira
a.txt
-r 递归复制
// 用于复制整个目录及目录下的内容
root@ubuntu:~# mkdir dirb
root@ubuntu:~# cp -r dira dirb
root@ubuntu:~# ls dirb
dira
-a 特殊文件的复制
// 当复制一些特殊文件时,需要使用-a选项保留文件属性,即可正常复制
root@ubuntu:~# cp -a /dev/zero ./zero
root@ubuntu:~# ll zero
crw-rw-rw- 1 root root 1, 5 Aug 6 01:07 zero
mv命令的使用场景
-b 移动文件并备份
// 移动文件内容覆盖到目标文件,并删除源文件,切记使用-b选项进行备份
root@ubuntu:~# echo "aaa" >a.txt
root@ubuntu:~# echo "bbb">b.txt
root@ubuntu:~# mv -b a.txt b.txt
root@ubuntu:~# cat b.txt
aaa
-n 跳过移动文件
// 如果目标文件已存在,则不进行移动文件,输出结果提示”不替换b.txt"
root@ubuntu:~# touch a.txt
root@ubuntu:~# mv -n a.txt b.txt
mv: not replacing 'b.txt'
-i 询问是否移动覆盖目标文件
// 若目标文件已存在,则询问是否进行覆盖,是则输入y,否则输入n
root@ubuntu:~# mv -i a.txt b.txt
mv: overwrite 'b.txt'? y
-u 移动前比较更新时间
// 当源文件比目标文件新时,才能进行移动操作
root@ubuntu:~# echo "aaaa" >a.txt
root@ubuntu:~# ll *.txt
-rw-r--r-- 1 root root 5 Aug 6 06:24 a.txt
-rw-r--r-- 1 root root 0 Aug 6 06:16 b.txt
root@ubuntu:~# mv -u b.txt a.txt
root@ubuntu:~# cat b.txt
root@ubuntu:~# mv -u a.txt b.txt
root@ubuntu:~# ll *.txt
-rw-r--r-- 1 root root 5 Aug 6 06:24 b.txt
-v 显示移动过程
root@ubuntu:~# touch a.txt b.txt
root@ubuntu:~# mv -v a.txt b.txt
renamed 'a.txt' -> 'b.txt'
rename命令使用场景
安装rename
root@ubuntu:~# sudo apt install rename
批量更改拓展名
root@ubuntu:~# touch a.txt b.txt c.txt
root@ubuntu:~# rename 's/\.txt$/.md/' *.txt
root@ubuntu:~# ls
a.md b.md c.md
批量更改文件名前缀
// An highlighted block
root@ubuntu:~# touch new1.txt new2.txt new3.txt
root@ubuntu:~# rename 's/^new/old/' new*
root@ubuntu:~# ls
old1.txt old2.txt old3.txt