普通文件

命令汇总

普通文件的基本操作有

0x00 文件创建

创建文件有以下方式

  • 使用touch命令
  • 使用文本编辑器

touch本来是用来修改已存在文件的时间戳,当文件不存在时可以用来创建空文件

# 不使用任何选项且文件不存在时,创建空文件
# 文件的atime/ctime/mtime都为当前时间
# 文件的权限模型为默认权限模型,属主和属组分别是当前用户和当前用户的基本组
$touch 1.txt

# 不使用任何选项但是文件存在时,将指定文件的atime/ctime/mtime都改为当前时间
$touch 1.txt

# 将atime/mtime改为指定时间,ctime自动会改为当前时间
$touch -t 201803150949.22 /u   # 时间戳格式为YYMMDDhhmm.ss

# 仅修改文件的atime,同时ctime会自动修改为当前时间
$touch -at 201803150953.55 /u  # 时间戳格式为YYMMDDhhmm.ss

# 仅修改文件的mtime,同时ctime会自动修改为当前时间
$touch -mt 201803150953.22 /u  # 时间戳格式为YYMMDDhhmm.ss

除此之外,还可以通过文本编辑器vimnano来创建文件

# 当vim、nano后面的文件名指定的文件不存在时就为创建新文件,否则为编辑该文件
$vim 1.txt
$nano 1.txt

0x01 文件删除

我们可以使用rm命令来实现文件的删除

$rm 1.txt     # 删除指定文件
$rm -f 1.txt  # 强制删除指定文件
$rm *.c       # 使用文件名通配机制,删除所有以.c结尾的文件

注意:指定文件名时可以使用文件名通配机制

0x02 文件移动

我们可以使用mv命令来实现文件的移动,也可以理解为文件剪切粘贴

$mv SRC DEST
$mv 1.txt /tmp   # 将1.txt剪切到/tmp目录下
# 假如SRC是一个文件
#     如果目标是一个文件且目标存在:覆盖
#     如果目标文件不存在:创建新文件,也可以理解为修改文件名
#     如果目标存在,且是个目录:剪切源至目标目录中,并保持原名

$mv SRC... DEST
$mv ./*.c /tmp  # 将当前目录下的所有.c文件剪切到/tmp目录下
# 假如SRC有多个文件:
#    如果目标存在,且是一个文件:移动无法进行
#    如果目标存在,且是一个目录:剪切各文件至目标目录中,并保持原名
#    如果目标不存在:剪切无法进行
# 如果SRC只有一个且是目录:对目录实现剪切时不需要使用-r选项
#    如果目标是一个文件且目标存在:移动失败
#    如果目标文件不存在:创建新目录,实现整个目录的剪切
#    如果目标存在,且是个目录:剪切源目录到目标目录中,并保持原名

# mv命令的常用选项:
#    -i:提示,交互
#    -f:强制覆盖

注意:指定文件名时可以使用文件名通配机制

0x03 文件复制

我们可以使用cp命令来实现文件的复制

$cp SRC DEST
$cp 1.txt /tmp   # 将1.txt复制到/tmp目录下
# 假如SRC是一个文件
#     如果目标是一个文件且目标存在:覆盖
#     如果目标文件不存在:创建新文件
#     如果目标存在,且是个目录:复制源至目标目录中,并保持原名

$cp SRC... DEST
$cp ./*.c /tmp  # 将当前目录下的所有.c文件复制到/tmp目录下
# 假如SRC有多个文件:
#    如果目标存在,且是一个文件:复制无法进行
#    如果目标存在,且是一个目录:复制各文件至目标目录中,并保持原名
#    如果目标不存在:复制无法进行
# 如果SRC只有一个且是目录:通常带上-r选项--递归复制,实现cp命令对目录的复制
#    如果目标是一个文件且目标存在:失败
#    如果目标文件不存在:创建新目录
#    如果目标存在,且是个目录:复制源目录到目标目录中,并保持原名

# cp命令的常用选项:
#     -r:递归复制
#     -i:提示,交互
#     -f:强制覆盖
#     -a: -dr 保留所有的文件信息
#     -d:当源为链接文件时,复制链接文件本身,而非指向的源文件
#     -p: 保持原有属性

注意:指定文件名时可以使用文件名通配机制

0x04 文件查找

参考文档

文件查找的方法有:

  • 使用find实时查找:进行实时查找、查找速度慢、进行精确匹配
  • 使用locate快速查找:依赖于由自动任务计划每天定时生成的数据库自动进行非实时查找;查找结果精确度较低,但查找速度快,可进行模糊查找;可以通过updatedb命令手动生成数据库

find命令查找文件的语法是:find [options] [查找路径] [查找条件] [处理动作exec]

  • options:

    • -maxdepth 1:查找深度为1
  • 查找路径:默认为当前目录

  • 查找条件:

    • 根据文件名和属主、属组查找

      • 默认查找指定目录下的所有文件
      • -name "filename":查找指定文件名的文件,该文件名格式支持文件名通配机制,严格区分大小写
      • -iname "filename":查找方法同上,但不区分大小写
      • -user UserName:根据属主查找,查找属主为UserName的文件
      • -group GroupName:根据属组查找,查找属组为GroupName的文件
      • -uid UID:根据属主的UID查找
      • -gid GID:根据属组的GID查找
      • -nouser:查找没有属主的文件
      • -nogroup:查找没有属组的文件
    • 根据文件类型查找

      • -type f:普通文件
      • -type d:目录
      • -type b:块设备
      • -type c:字符设备
      • -type l:符号链接文件
      • -type p:命令管道
      • -type s:套接字
    • 根据文件大小查找:-size [+|-]Number[k|M|G]

      • +表示大于
      • -表示小于
    • 根据文件时间戳查找

      • -atime [+|-]Number:根据访问时间来查找,单位为天
      • -ctime [+|-]Number:根据改变时间来查找,单位为天
      • -mtime [+|-]Number:根据修改时间来查找,单位为天
      • -amin [+|-]Number:根据访问时间来查找,单位为分钟
      • -cmin [+|-]Number:根据改变时间来查找,单位为分钟
      • -mmin [+|-]Number:根据修改时间来查找,单位为分钟
      • 以当前时刻为参照点的过去时间段,2表示[2,3)时间段内的操作+2表示[3,+oo)时间段内的操作-2表示[0,2)时间段内的操作
    • 根据文件权限查找:-perm [+|-]MOD

      • MODE:精确匹配权限
      • +MODE:包含或关系,任何一类用户的任何一位权限匹配即可,常用于查找某类用用户的某特定权限是否存在。+444表示至少有一类用户有读权限
      • -MODE:包含且关系,每类用户的指定权限位都必须匹配。-444表示每类用户都有读权限
    • 组合条件查找:组合上述查找条件

      • -a:与条件,表示同时满足,默认值可省略;格式为条件1 [-a] 条件2
      • -o:或条件,表示只一个满足,格式为条件1 -o 条件2
      • {-not | !}:非条件,表示条件取反,格式为-not 条件
      • 非的优先级大于与,与的优先级大于或
  • 处理动作exec

    • 默认操作是显示查找结果
    • find [查找条件路径] | cpio:将查找结果进行归档
    • find [查找条件路径] | xargs COMMAND:xargs会将管道传递过来的字符串转换为后面命令的传入参数做文件处理;如果没有xargs转换,则通过管道传递过来的字符串只能做文本处理,不能进行文件处理等操作
    • find [查找条件路径] [-print]:默认值,可省略,表示打印到标准输出上。
    • find [查找条件路径] -ls:表示以长格式输出各种文件信息。
    • find [查找条件路径] -exec COMMAND {} \;:把查找到的所有文件一次性地传递给-exec执行指定的命令;{}是用来接收传递值的,同时还可以被后向引用接收到的传递值
    • find [查找条件路径] -ok COMMAND {} \;:把查找到的所有文件一次性地传递给-ok执行指定的命令;{}是用来接收传递值的,同时还可以被后向引用接收到的传递值

find命令的使用用例如下

$find ./ -name "*.o" -exec rm {} \;     # 递归当前目录及子目录删除所有.o文件
$find ./ -name '*.o'                    # 查找目标文件夹中是否有obj文件
$find /var/ -user root -a -group mail   # 查找/var目录属主为root且属组为mail的所有文件
$find /usr/ -not \(-user root -o -user bin -o -user hadoop\) # 查找/usr目录下不属于root、bin或hadoop的所有文件
$find /etc/ -mtime -7 -a -not \(-user root -o -user hadoop\) # 查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件
$find /etc/ -size +1M -a -type f        # 查找/etc/目录下大于1M且类型为普通文件的所有文件
$find /etc/ -not -perm +222             # 查找/etc/目录所有用户都没有写权限的文件

locate命令使用方法如下

$updatedb             # 更新数据索引库,以获得最新的文件索引信息
$locate STRING        # 根据上述数据索引库查找文件

0x05 文件链接

我们可以通过ln命令为文件建立硬链接和软链接

$ln /etc/fstab ~/fstab            # 为/etc/fstab文件创建一个硬链接文件
$ln -s /usr/local/docker ~/docker # 为/usr/local/docker目录创建一个软链接文件

# 不能对目录创建硬链接,但是可以创建软链接
# -v选项可以显示链接文件的创建过程

0x06 文件压缩

注意:下面压缩工具中``gzip``、bzip2xz只能压缩文件,不能压缩目录;zip工具既可以用来压缩文件又可以用来压缩目录

gzip压缩工具

# gzip工具的压缩文件后缀为.gz
# gzip工具压缩完成后会把原文件给删除,保留压缩文件
$gzip -6 1.txt                   # 指定压缩比1-9,默认的为6,压缩比越大,压缩文件越小
$gzip -c 1.txt >> foo.gz         # -c选项将压缩内容重定向至指定的压缩文件,这样可以实现压缩后保留源文件
$gzip -c 1.txt 2.txt > foo.gz    # 同时压缩多个文件输出到指定压缩文件
$cat 1.txt 2.txt | gzip > foo.gz # 实现功能和上面一样,但是压缩效果要好
$zcat foo.gz                     #查看.gz压缩文件中的内容,它会创建一个临时目录将压缩文件解压并提供访问查看,类似于cat查看普通文件内容一样

bzip2压缩工具

# bzip2工具的压缩文件后缀为.bz2
# 对于大文件的压缩,bzip2的压缩效果比gzip要好
# bzip2工具压缩完成后会把原文件给删除,保留压缩文件
$bzip2 -k 1.txt                    # 压缩后保留原文件,不会删除
$bzip2 -6 1.txt                    # 指定压缩比1-9,默认的为6,压缩比越大,压缩文件越小
$bzip2 -c 1.txt >> foo.bz2         # -c选项将压缩内容重定向至指定的压缩文件,这样可以实现压缩后保留源文件
$bzip2 -c 1.txt 2.txt > foo.bz2    # 同时压缩多个文件输出到指定压缩文件
$cat 1.txt 2.txt | bzip2 > foo.bz2 # 实现功能和上面一样,但是压缩效果要好
$bzcat foo.bz2                     #查看.bz2压缩文件中的内容,它会创建一个临时目录将压缩文件解压并提供访问查看,类似于cat查看普通文件内容一样

xz压缩工具

# xz工具的压缩文件后缀为.xz
# 该工具的压缩效果是最好的
# xz工具压缩完成后会把原文件给删除,保留压缩文件
$xz -k 1.txt                    # 压缩后保留原文件,不会删除
$xz -6 1.txt                    # 指定压缩比1-9,默认的为6,压缩比越大,压缩文件越小
$xz -c 1.txt >> foo.xz         # -c选项将压缩内容重定向至指定的压缩文件,这样可以实现压缩后保留源文件
$xz -c 1.txt 2.txt > foo.xz    # 同时压缩多个文件输出到指定压缩文件
$cat 1.txt 2.txt | xz > foo.xz # 实现功能和上面一样,但是压缩效果要好
$xzcat foo.xz                     #查看.xz压缩文件中的内容,它会创建一个临时目录将压缩文件解压并提供访问查看,类似于cat查看普通文件内容一样

zip压缩工具:在这里只介绍如何压缩文件

# 该工具的压缩文件后缀为.zip
# 该工具属于归档压缩工具(先对文件进行归档然后进行压缩),所有不会在压缩或者解压时删除原文件
$zip message.zip message       # 将message文件压缩成message.zip文件。需要指定压缩文件名
$zip -6 message.zip message    # 指定压缩比1-9,默认的为6,压缩比越大,压缩文件越小
$find . -name "*.[ch]" -print | zip source -@  # 将当前目录下所有.c和.h源文件归档压缩;-@选项使zip不再从命令行中获取待压缩文件路径,而是从标准输入或管道中获取

0x07 文件解压

此处的文件解压工具与上述的压缩工具一一对应

gunzipgzip压缩工具的解压工具,只解压.gz压缩文件

# 解压缩后会把压缩文件删除,保留原文件
$gunzip 1.txt.gz
$gunzip -c 1.txt.gz > 2.txt         # -c选项将解压内容重定向至指定文件,这样可以实现解压后保留源压缩文件
$gzip -d 1.txt.gz                   # 类似于gunzip
$gzip -cd old.gz | gzip > new.gz    # 解压压缩文件然后压缩到另一压缩文件中,源压缩文件不变
$gzip -d old.gz | gzip > new.gz     # 解压压缩文件然后压缩到另一压缩文件中,源压缩文件会删除,保留解压后原文件

bunzip2bzip2压缩工具的解压工具,只解压.bz2压缩文件

# 解压缩后会把压缩文件删除,保留原文件
$bunzip2 1.txt.bz2
$bunzip2 -k 1.txt.bz2                 # 解压后不会删除压缩文件
$bunzip2 -c 1.txt.bz2 > 2.txt         # -c选项将解压内容重定向至指定文件,这样可以实现解压后保留源压缩文件
$bzip2 -d 1.txt.bz2                   # 类似于bunzip2
$bzip2 -cd old.bz2 | gzip > new.bz2   # 解压压缩文件然后压缩到另一压缩文件中,源压缩文件不变
$bzip2 -d old.bz2 | gzip > new.bz2    # 解压压缩文件然后压缩到另一压缩文件中,源压缩文件会删除,保留解压后原文件

unxzxz压缩工具的解压工具,只解压.xz压缩文件

# 解压缩后会把压缩文件删除,保留原文件
$unxz 1.txt.xz
$unxz -k 1.txt.xz                 # 解压后不会删除压缩文件
$unxz -c 1.txt.xz > 2.txt         # -c选项将解压内容重定向至指定文件,这样可以实现解压后保留源压缩文件
$xz -d 1.txt.xz                   # 类似于unxz
$xz -cd old.xz | gzip > new.xz    # 解压压缩文件然后压缩到另一压缩文件中,源压缩文件不变
$xz -d old.xz | gzip > new.xz     # 解压压缩文件然后压缩到另一压缩文件中,源压缩文件会删除,保留解压后原文件

unzipzip压缩工具的解压工具,只解压.zip压缩文件

# 该工具属于归档压缩工具(先对文件进行归档然后进行压缩),所有不会在压缩或者解压时删除原文件
$unzip message.zip          # 解压缩到当前目录下
$unzip message.zip -d test/ # 解压缩到test目录下