在 Linux 下工作,打交道比较多的就是文件了,毕竟 Linux 下工作一切皆文件嘛。Linux 也为大家提供了多种用于处理文件的命令,合理使用这些命令可以大大节省你的时间,并让我们的工作负担不再那么沉重。
寻找文件的技巧
当我们查找文件时,第一时间想到的肯定是 find 命令。但是如果我们搜索的路径范围比较大时,花费的时间会比较多,在这个情况下 find 命令就不是最优的方式了。
我们可以使用 ls 快速找到近期更新的文件。比如,想知道自己昨天离开办公室回家前调用的脚本吗?小case嘛!使用 ls 命令并加上 -ltr 选项。最后一个列出的将是最近创建或更新的文件。
- $ ls -ltr ~/bin | tail -3
- -rwx------ 1 shs shs 229 Sep 22 19:37 checkCPU
- -rwx------ 1 shs shs 285 Sep 22 19:37 ff
- -rwxrw-r-- 1 shs shs 1629 Sep 22 19:37 test2
如果我们仅仅想列出今天更新的文件,可以这样操作:
- $ ls -al --time-style=+%D | grep `date +%D`
- drwxr-xr-x 60 shs shs 69632 09/23/19 .
- drwxrwxr-x 2 shs shs 8052736 09/23/19 bin
- -rw-rw-r-- 1 shs shs 506 09/23/19 stats
如果我们想要查找的文件可能不在当前目录中,那么 find 将比 ls 更加灵活强大。但是,find 命令的输出结果可能会比较多,我们可以使用它的一些选项来过滤掉自己不想要的结果。
比如,在下面的命令中,我们不搜索以点开头的目录(即隐藏目录),指定我们要查找的是文件而不是目录,并要求仅显示最近一天更新过的文件。
命令如下:
- $ find . -not -path '*/\.*' -type f -mtime -1 -ls
- 917517 0 -rwxrw-r-- 1 shs shs 683 Sep 23 11:00 ./newscript
注意 -not 选项反转了 -path 的行为,因此我们不会搜索以点开头的子目录。
如果我们只想查找比较大的文件和目录,那么可以使用类似 du 这样的命令,它会按大小列出当前目录的内容。然后,再将输出的内容通过管道传输到 tail 命令,仅查看比较大的几个。
- $ du -kx | egrep -v "\./.+/" | sort -n | tail -5
- 918984 ./reports
- 1053980 ./notes
- 1217932 ./.cache
- 31470204 ./photos
- 39771212 .
-k 选项让 du 以块列出文件大小,而 x 可防止其遍历其他文件系统上的目录(例如,通过符号链接引用)。命令运行后,du 命令会先列出文件大小,然后再调用 sort -n 来按照大小排序。
统计文件数量的技巧
使用 find 命令可以很容易地计数任何特定目录中的文件。不过大家要注意的是,find 会递归到子目录中,并将这些子目录中的文件与当前目录中的文件一起计数。
比如,我们想计数一个特定用户(alvin)的主目录中的文件,我们可以先用 find 命令找到文件,再用 wc 命令进行统计。
- $ find /home/alvin -type f 2>/dev/null | wc -l
- 35624
请注意,我们将 find 命令的错误输出发送到 /dev/null,为了避免搜索类似 ~/.cache 这类无法搜索并且对它的内容也不感兴趣的文件夹。
必要时,我们可以使用 -maxdepth 1 选项将 find 搜索范围限制在单个目录中,或者也可以将其设置为自己想要搜索的深度:
- $ find /home/alvin -maxdepth 1 -type f | wc -l
- 387
文件重命名的技巧
使用 mv 命令可以很容易地重命名一个文件,但是有时我们想重命名大量文件,并且不想花费大量时间,要怎么操作呢?这个时候 rename 命令就要派上用场了。
例如,我们想要将当前目录下所有文件的文件名中含有空格的全部更改为下划线,大家可以使用如下命令:
- $ rename 's/ /_/g' *
大家应该能想到,此命令行中的 g 代表「全局」。这就意味着该命令会将文件名中的所有空格更改为下划线,而不仅仅是第一个。
如果我们想要把文本的文件删除掉 .txt 扩展名,可以使用如下命令:
- $ rename 's/.txt//g' *