Linux 命令---文件管理

最后更新:
阅读次数:

创建目录

  • mkdir
#  在当前目录下创建一个目录
$ mkdir ./folder

# -p 选项可以通过一个不存在的路径创建一个目录(并且路径上不存在的目录也会同时被创建)
$ mkdir -p ./a/b/c/d

创建文件

  • cat
# 使用 cat 创建一个文件,并且可以预写入一些内容
$ cat > test.txt

# 将多个文件的内容连接起来,以覆盖的形式写入到新的文件
$ cat 1.c 2.c > 3.c

# 将多个文件的内容连接起来,以追加的形式写入到新的文件
$ cat 1.c 2.c > 3.c
  • touch
# 使用 touch 命令创建一个空文件
$ touch ./dir/666.jpg

# 一次创建多个空文件
$ touch 1.txt 2.txt 3.txt

切换工作目录

  • pwd
# 输出当前工作目录的路径
$ pwd
  • cd
# 切换到指定目录
$ cd ./Applications

$ cd ./Visual\ Studio\ Code
$ cd ./'Visual Studio Code'

# 切换到当前用户的 home 目录
$ cd

# 切换到当前目录的父目录
$ cd ..

# 切换到最近一次选择的目录
$ cd -

查看属性信息

  • file
# 显示文件类型
$ file index.html
# index.html: HTML document text, ASCII text, with very long lines
  • stat
# 输出一个文件或目录的属性信息
$ stat /bin
$ stat /bin/bash

# -x 以一种比较容易查看的形式输出文件或目录的属性信息
$ stat -x /bin
$ stat -x /bin/bash

查看目录内容

  • ls
# 列出当前目录下可见的内容(不包含隐藏文件)
$ ls

# 展示指定目录下的文件或目录
$ ls ./folder

# 以一行一行的形式列出当前目录的所有可见文件
$ ls -1

# -l 显示所有可见文件的属性信息
$ ls -l

# -a 列出所有文件,包括隐藏文件
$ ls -a

# -i 显示每个文件的 inode
$ ls -i

# -h 以易读的方式显示文件大小(显示为KB, MB, GB...)
$ ls -lh

# -R 除过列出当前目录内容外,还同时列出所有子目录层
$ ls -R
  • tree
# 以树状的形式列出当前目录下可见的内容(不包含隐藏文件)
$ tree

# 以树状图的形式列出一个目录包含的内容
$ tree ./folder

# -C 对不同类型的文件使用颜色进行区分
$ tree -C

# -L num 指定显示的目录深度
$ tree -L 2

# -a 显示所有文件,包括隐藏的文件
$ tree -a

# -d 只显示目录
$ tree -d

# -f 显示每个文件相对当前目录的完整的相对路径
$ tree -f

# -i 取消显示的缩进
$ tree -i

# -P pattern 列出匹配 pattern 的文件
$ tree -P "*.jpg"

# -o filename 将结果输出至指定文件
$ tree -o tree-test.txt

查看文件内容

  • cat
# 查看一个文件的所有内容
$ cat file.txt

# 同时查看多个文件的所有内容
$ cat file1.txt file2.txt

# -n 命令可以在每行的前面加上行号
$ cat -n main.js
  • more

more 命令,功能类似 cat ,cat 命令是将整个文件的内容从上到下显示在屏幕上,而 more 命令会以一页一页的形式显示,方便使用者逐页阅读。使用 more 命令后,按空白键(space)就往下一页显示,按 B 键就会往回(back)一页显示。

# 以分页的形式显示一个文件的所有内容
$ more 1.html
  • less

less 命令与 more 命令类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。

# 以分页的形式显示一个文件的内容
$ less 1.html
  • head
# 默认显示文件开头的 10 行文本
$ head file.txt

# -n 指定要显示的行数
$ head -n 5 file.txt
  • tail
# 默认显示文件最后的 10 行文本
$ tail file.txt

# -n 指定要显示的行数
$ tail -n 5 file.txt

# -f 循环查看文件内容
$ ping baidu.com > ping.log & # run ping process background
$ tail -f ping.log # show file in loop
$ kill process_id # kill the ping process

复制

  • cp
# 直接拷贝一个文件,出现重复则覆盖
$ cp file1 file2

# -p 拷贝文件1 到文件2 ,并保持文件的权限、属主和时间戳等属性
$ cp -p file1 file2

# -i 拷贝 file1 到 file2 ,如果 file2 存在会提示是否覆盖
$ cp -i file1 file2

# -r 递归复制一个目录
$ cp -r dir1 dir2

# -v 显示指令的执行过程
$ cp -rv dir1 dir2
  • scp

scp 命令与 cp 命令功能类似,但是 scp 命令是用于本地与远程服务器之间复制文件或目录。

# 语法:scp [参数] local_file remote_username@remote_ip:remote_path
# -r 复制目录
# -v 显示指令的执行过程

# 从本地服务器复制到远程服务器(scp 本地 远程)
$ scp local_file.tar root@207.226.60.118:~/scp/remote_file.tar
$ scp -rv local_folder root@207.226.60.118:~/scp/

# 从远程服务器复制到本地服务器(scp 远程 本地)
$ scp root@207.226.60.118:~/scp/remote_file.txt ./file_from_remote.txt

移动

  • mv
# 移动文件
$ mv old.txt ./dir/new.txt

# -i 将文件名 old.txt 重命名为 new.txt,如果 new.txt 存在,则提示是否覆盖
$ mv -i old.txt new.txt

# -f 将文件名 old.txt 重命名为 new.txt,如果 new.txt 存在,则不会询问而直接覆盖
$ mv -f old.txt new.txt

# -v 会输出重命名的过程,当文件名中包含通配符时,这个选项会非常方便
$ mv -v old.txt new.txt

重命名

  • mv对单个文件或目录进行重命名
# 对文件进行重命名,出现重复则直接覆盖
$ mv old.txt new.txt
  • rename对多个文件或目录进行批量重命名

参考:Renaming files in a folder to sequential numbers

# 语法: rename a b
# a:perl regular expression(perl 正则表达式)
# 按字符串替换: s/expr1/expr2/[gi] 使用表达式 expr2 替换 expr1,g 全局替换,i 忽略大小写
# 按字符替换: y/charset1/charset2/
# 举例: y/abc/123/,所有a替换为1,所有b替换为2,所有c替换为3
# b:files 被重命名的文件,可使用通配符

# 将后缀为 .html 的文件的后缀统一改为 .php
$ rename 's/\.html$/\.php/' *.html

# 将文件名重命名为一系列序列数字
# -N 指定计数命名的格式
$ rename -N 0001 's/.+/$N.php/' *.php

# 将文件名转换为小写模式
# -f 忽律文件已存在的报错信息
$ rename -f 'y/A-Z/a-z/' *

# 将文件名的空格替换为下划线
$ rename 's/\s+/_/g' *

删除

  • rm
# 直接删除文件
$ rm file.txt

# -f 忽略不存在的文件,从不给出提示
$ rm -f file.txt

# -i 删除文件前需要先确认一下
$ rm -i file.txt

# 一次删除多个文件
$ rm 1.txt 2.txt 3.txt

# 利用正则表达式删除所有匹配的文件
$ rm *.txt

# -r 递归删除目录下所有文件,并删除该目录
$ rm -r ./folder

# -v 详细显示删除进行的步骤(常用于删除目录时)
$ rm -rv ./folder
  • rmdir
# 删除一个空目录(即该目录下不存在任何形式的文件或目录)
rmdir ./folder

# -p 子目录 folder2 为空目录,当子目录被删除后,若其父目录 folder 也为空时,父目录会一同被删除
rmdir -p ./folder/folder2

# -v 显示指令的执行过程
rmdir -pv ./folder

搜索

搜索文件

  • find 从指定目录中以某些条件搜索文件
# 搜索指定目录下的所有文件
$ find ./

# 搜索多个指定目录下的所有文件
$ find ./folder1 ./folder2

# -name 按照文件名来查找文件
$ find ./ -name '*.json'

# -path 按照路径来查找文件
$ find ./ -path '**/js/**'

# -empty 按照文件或目录是否为空来查找文件
$ find ./ -empty

# -prune 忽略指定的目录,即不搜索指定的目录

# -not 反转匹配文件的条件(-not 与 ! 等义)
$ find ./ -not -name '*.js'
$ find ./ ! -name '*.js'

# -maxdepth n 设置搜索的深度
$ find ./ -maxdepth 1

# -mtime n 按照文件的更改时间来查找文件(单位:天)
# -n 表示距现在小于 n 天,n 表示距现在正好 n 天,+n 表示距现在大于 n 天
$ find ./ -mtime -1 # 返回最近更改时间距现在小于一天(小于24个小时)的所有文件
$ find ./ -mtime +1 # 返回最近更改时间距现在大于一天(大于24个小时)的所有文件
$ find ./ -mtime +1 -mtime -2 # 返回最近更改时间距现在大于一天但小于两天的所有文件

# -mmin n 按照文件的更改时间来查找文件(单位:分钟)

# -type t 按照文件类型查找文件
# b - 块设备文件
# d - 目录
# c - 字符设备文件
# p - 管道文件
# l - 符号链接文件
# f - 普通文件
$ find ./ -type d

# -size n[ckMGTP] 按文件大小来查找文件
# c - 字节(byte)
# k - KB
# M - MB
# G - GB
# T - TB
# P - PB
$ find ./ -size +100M # 查找文件大小大于 100MB 的文件
$ find ./ -size -1G # 查找文件大小小于 1GB 的文件
$ find ./ -size +1M -size -20M # 查找文件大小大于 1MB 但小于 20MB 的文件

# -samefile 匹配是指定文件的硬链接的所有文件
$ find ./ -samefile test.txt

# -exec 为找到的每个文件执行指定的命令(注意命令以 `\;` 收尾)
# 将匹配到的每个文件都复制到 collect 目录下
$ find ./ -path '**/js/**' -exec cp {} ./collect/ \;

# 将匹配到的每个文件都打包到 png-package.tar 文件中
$ find ~/Downloads -name '*.png' -exec tar -rvf png-package.tar {} \;

搜索字符串

  • grep 从指定文件或目录中查找指定字符串
# 在文件中查找字符串(区分大小写)
$ grep 'let' 1.js

# 在匹配的文件中查找字符串
$ grep 'let t' js/*.js

# -i 忽略字符串的大小写
$ grep -i 'let' 1.js

# -c 统计匹配字符出现的次数
$ grep -c 'let' 1.js

# -A 输出成功匹配的行,以及该行之后的三行
$ grep -A 3 'let' 1.js

# -r 在一个目录中递归查询包含指定字符串的文件
$ grep -r "ramesh" ./

更改时间戳

  • touch

touch 命令一般用来更改文件的访问时间与修改时间。

# 新建一个文件
$ touch file.txt

# -t 一般只更改文件的最后修改时间与访问时间为指定时间,如果指定时间小于文件当前的创建时间,那么也会更改文件的创建时间至指定时间(仅限 Mac)
# 语法:touch -t YYYYMMDDhhmm file
$ touch -t 199901122356 file.txt

# 在 Mac 上,可以直接使用 SetFile 命令更改文件的创建时间
$ SetFile -d '12/31/1999 23:59:59' file.txt
$ SetFile -d "$(GetFileInfo -m test.txt)" file.txt

更改权限

  • chmod
# 用字母表示权限
# chmod <用户类型><操作符><权限设置> <文件>

# 用户类型
# u 文件所有者
# g 文件所属用户组下的所有用户
# o 其它用户(既不是文件所有者,也不是文件所属用户组中用户)
# a 所有用户,相当于上 ugo 的简写

# 操作符
# + 为指定用户增加指定权限(如果权限存在则忽略,不存在则加上)
# - 为指定用户减少指定权限(如果权限存在则去掉,不存在则忽略)
# = 为指定用户设置指定权限(指定权限会覆盖掉之前的权限)

# 权限代号
# r 可读权限,对应权限数字表示法的 4
# w 可写权限,对应权限数字表示法的 2
# x 可执行权限,对应权限数字表示法的 1
# - 删除权限,对应权限数字表示法的 0
# s 特殊权限(暂不讨论,我也不清楚怎么用)


$ chmod u+r 1.txt
$ chmod u+rwx 1.txt
$ chmod ug+x 1.txt
$ chmod a=--- 1.txt
# 用数字表示权限(三个数字)
# 比如下面的数字 750 ,7 对应用户权限,5 对应用户组权限,0 对应其它用户权限
# 7 = 4(可读)+ 2(可写)+ 1(可执行)
# 5 = 4(可读)+ 1(可执行)
# 0 = 0(没有权限)

$ chmod 750 file.txt
# -R 更改一个目录的权限
$ chmod -R 777 ./folder

# 同时修改不同用户权限
$ chmod -R u=rwx,go=r ./folder

# 将一个文件变为可执行文件
$ chmod +x 1.sh # 等价于 chmod a+x 1.sh

更改用户或用户组

  • chgrp更改文件所属的用户组
# 更改文件所属的用户组
$ chgrp bin file.png

# -v 显示指令的执行过程
# -R 更改目录所属的用户组
$ chgrp -vR bin ./folder
  • chown更改文件所属的用户或用户组
# 更改文件所属的用户
$ chown root file.png

# 更改文件所属的用户组
$ chown :staff file.png

# 同时更改文件所属的用户和用户组
$ chown percy507:bin file.png

# -v 显示指令的执行过程
# -R 更改目录所属的用户、用户组
$ chown -vR percy507 ./*

其它

  • wc
# 统计文件的行数、词数和字符数
$ wc 1.txt

# -l 统计行数
$ wc -l 1.txt

# -m 统计字符数
$ wc -m 1.txt

# -w 统计单词数
$ wc -w 1.txt
  • ln
# 创建硬链接
$ ln text.txt hardlink.txt

# -s 创建软链接
$ ln -s test.txt softlink1.c # 基于相对路径
$ ln -s /home/test/test.txt softlink2.c # 基于绝对路径
  • link

link 命令只能用来创建硬链接,不能创建软链接。

# 创建硬链接
$ link text.txt hardlink.txt