Skip to content

Latest commit

 

History

History
897 lines (602 loc) · 22.7 KB

06、文件与目录管理.md

File metadata and controls

897 lines (602 loc) · 22.7 KB

文件与目录管理

cd:切换当前文件夹

cd [-L|-P] [directory]

  -L
    逻辑(logically)对待 操作符 ..
    符号链接部分将不会再在 操作符 .. 解析之前解析

  -P
    物理(Physically)对待 操作符 ..
    符号链接部分将不会再在 操作符 .. 解析之前解析

pwd:打印当前工作文件夹的完整文件名

pwd [OPTION]

  -L, --logical
    使用环境变量 PWD,即便它包含了符号链接

  -P, --physical
    解析任何符号链接

  --help
    打印该帮助文档

  --version
    打印版本信息

ls:罗列文件夹内容

ls [OPTION] [FILE]

罗列 [FILE] 的信息,默认为当前目录
若不存在参数 -cfruvSUX 或者 --sort 中的任意一个,则按照字母表排序排列

  -a, --all
    不要忽略以 . 开头的项目

  -A, --almost-all
    忽略 . 和 ..

  --author
    与 -l 连用,打印每个文件的作者

  -b, --escape
    以 C 风格的转义字符显示非图形字符

  --block-size=SIZE
    与 -l 连用,当打印 size 的时候缩放其为 SIZE 倍;
    eg. '--block-size=M';
    参见下方 SIZE 格式

  -B, --ignore-backups
    忽略以 ~ 结尾的文件

  -c
    与 -lt 连用:以 ctime 排序,并显示 ctime;
    与 -l 连用:显示 ctime,但以名称排序;
    其他情况:以 ctime 排序,最新的在最前

  -C
    按 列 罗列项目

  --color[=WHEN]
    为输出着色;
    WHEN 可以为
      'always'(忽略时为默认值)
      'auto'
      'never';
      更多信息见下方

  -d, --directory
    罗列文件夹自身,而非其内容

  -D, --dired
    为 Emacs 的 dired 模式生成输出

  -f
    不要排序,启用 -aU,禁用 -ls --color

  -F, --classify
    在条目后追加指示器(*/=>@| 中的一个)

  --file-type
    同上,但不追加 *

  --format=WORD
    across -x, commas -m, horizontal -x, long -l, single-column, -1, verbose -l, vertical -C

  --full-time
    类似 -l --time-style=full-iso

  -g
    类似 -l,但不显示所有者

  --group-directories-first
    在文件前显示文件夹;
    可以追加 --sort 参数,一旦使用了 --sort=none (-U)则取消该参数

  -G, --no-group
    在场列表中,不打印组名称

  -h, --human-readable
    与 -l 和 -s 连用,以 1K 234M 2G 这样的形势打印文件大小

  --si
    同上,但使用 1000 而非 1024 为底

  -H, --dereference-command-line
    解析命令行列出来的符号链接

  --dereference-command-line-symlink-to-dir
    解析命令行中指向目录的软链接

  --hide=PATTERN
    不要显示任何匹配上 shell 通配样式 PATTERN 的条目(被 -a 或 -A 覆盖)

  --hyperlink[=WHEN]
    超链接文件名;
    WHEN 可以为
    'always'(忽略则为默认值)
    'auto'
    'never'

  --indicator-style=WORD
    向条目名称后追加 WORD:
      none(默认)
      斜线(-p)
      文件类型(--file-type)
      分类(-F)

  -i, --inode
    打印每个文件的索引号

  -I, --ignore=PATTERN
    不要罗列任何与 shell 通配样式 PATTERN 符合的条目

  -k, --kibibytes
    默认为 1024-byte 块下的磁盘用量;
    仅与 -s 连用,以文件夹为计数

  -l
    使用长列表模式

  -L, --dereference
    当显示一个符号链接的文件信息时,显示链接所指向的文件,而非链接本身

  -m
    用逗号分隔的条目列表填充宽度

  -n, --numeric-uid-gid
    类似 -l,但使用数字表示的用户 ID 和组 ID

  -N, --literal
    非引用方式显示条目名称

  -o
    与 -l 类似,但不显示组信息

  -p, --indicator-style=slash
    向文件夹后追加 / 提示符

  -q, --hide-control-chars
    以 ? 显示非图形字符

  --show-control-chars
    以原始样式显示非图形字符(默认,除非程序时 ls,同时输出端口是终端)

  -Q, --quote-name
    用双引号引起一个名称

  --quoting-style=WORD
    指定引起条目名称的引号风格:
    literal, locale, shell, shell-always, shell-escape, shell-escape-always, c, escape
    (覆盖 QUOTING_STYLE 环境变量)

  -r, --reverse
    排序时反向

  -R, --recursive
    递归罗列次级文件夹

  -s, --size
    以块为单位打印每个文件占用的大小

  -S
    以文件大小排序,大者优先

  --sort=WORD
    以 WORD 而非名字排序:
      无(-U)
      大小(-S)
      时间(-t)
      版本(-v)
      后缀名(-X)

  --time=WORD
    与 -l 连用,显示时间 WORD 而非默认的修改时间:
      atime / access / use (-u);
      ctime / status (-c);
    若同时指定了 --sort=time 则该项也同时指定排序方法(新者优先)

  --time-style=TIME_SYTLE
    与 -l 连用时, 时间/日期的格式;
    参见下方 TIME_STYLE

  -t
    按修改日期排序,新者优先

  -T, --tabsize=COLS
    将制表符定义为 COLS 列 而非默认的 8 列

  -u
    与 -lt 连用:以读取时间排序,并显示;
    与 -l 连用:显示读取时间但以名称排序;
    其他情况:以读取时间排序,新者优先

  -U
    不要排序;
    以目录原始的顺序打印

  -v
    以(版本)号码的文本自然形式排序

  -w, --width=COLS
    将输出宽度设置为 COLS 列,
    0 表示无限制

  -x
    以行而非列罗列条目

  -X
    以项目的扩展名的字母序排序

  -Z, --context
    打印每个文件的安全上下文

  -1
    每行答应一个文件。
    与 -q 或 -b 连用防止 '\n'

  --help
    打印该帮助并推出

  --version
    打印版本号并退出

  SIZE 参数是一个具有可选单位的整数值(举例:10K 为 10*1024)。
  单位可以是 K, M, G, T, P, E, Z, Y(1024 为底)
  或者 KB, MB (1000 为底)

  TIME_STYLE 参数可以是 full-iso, long-iso, iso, locale, 或者 +FORMAT
  FORMAT 与 date(1) 中所解释的类似。
  若 FORMAT 的格式为 FORMAT1<newline>FORMAT2,则
  FORMAT1 作用于非最近的文件
  FORMAT2 作用于最近的文件
  TIME_STYLE 中具有 'posix-' 前缀的,仅在 POSIX locale 之外的部分起效
  同时 TIME_STYLE 环境变量设置了默认使用的样式

  用颜色来区分文件类型默认是关闭的,也可以通过 --color=never 来强制关闭。
  使用 --color=auto,可以让 ls 仅针对标准输出连接至终端时才使用着色代码。
  LS_COLORS 环境变量可以修改设置。
  使用 dircolors 命令来设置它。

mkdir:创建文件夹

mkdir [OPTION] DIRECTORY

  -m, --mode=MODE
    设置文件权限

  -p, --parents
    按需创建父级文件夹

  -v, --verbose
    打印创建的文件夹的信息

  -Z
    为每个创建的文件夹设置默认的 SELinux 安全上下文

  --context[=CTX]
    若附带了 [=CTX],则按照附带的内容设置文件夹的 SELinux 或者 SMACK 安全上下文属性
    否则行为同 -Z

  --help
    显示该帮助并退出

  --version
    显示版本并推出

环境变量 $PATH

$PATH 指定了系统本身查找命令的默认目录路径
比如 ls 这个命令,即使不输入全路径 /bin/ls 也可以在任何地方直接执行,就是依靠 $PATH 中写入了 /usr/bin 这个目录

$PATH 可以通过

echo $PATH

来查看,

在 Linux 中, PATH 使用 冒号 : 来做为不同路径之间的分隔符

一般来说,不同用户的 $PATH 的内容是不完全一样的

可以通过以下代码来修改 PATH

PATH="[otherPath]:${PATH}"

大括号 {} 用来明确定义变量的名称

cp 复制文件和文件夹

cp [选项]... [-T] SOURCE DEST
cp [选项]... SOURCE... DIRECTORY
cp [选项]... -t DIRECTORY SOURCE...

  -a, --archive
    等同于 -dR --preserve=all

  --attributes-only
    不要复制文件数据,仅复制属性

  --backup=[CONTROL]
    为每个已经存在的目标文件创建备份

  -b
    类似 --backup 但不接受参数

  --copy-contents
    当递归时,复制特殊文件的内容

  -d
    等同于 --no-dereference --preserve=links

  -f, --force
    若无法打开一个已经存在的目标文件,则移除它,并重试(若已经使用了 -n,则该选项被忽略)

  -i, --interactive
    在覆盖前提示(覆盖前一个 -n 选项)

  -H
    追寻在命令行中的 SOURCE 中的符号链接

  -l, --link
    硬链接而非拷贝文件

  -L, --dereference
    永远追寻在命令行中的 SOURCE 中的符号链接

  -n, --no-clobber
    不要覆盖已经存在的文件(覆盖前一个 -i 选项)

  -P, --no-dereference
    从不追寻 SOURCE 中的符号链接

  -p
    等同于 --perserve=mode,ownership,timestamps

  --preserve[=ATTR_LIST]
    保留指定的属性(默认为:mode,ownership,timestamps),可以附加的属性:context,links,xattr,all

  --no-preserve=ATTR_LIST
    不要保留指定的属性

  --parents
    在 DERECTORY 使用全源文件名

  -R, -r, --recursive
    递归拷贝目录

  --reflink[=WHEN]
    控制 clone/CoW 拷贝。见下

  --remove-destination
    在尝试打开每个已经存在的目标文件之前移除他们(与 --force 不同)

  --sparse=WHEN
    控制 sparse 文件的创建。见下

  --strip-trailing-slashes
    从每个 SOURCE 选项中移除任何末尾的斜线

  -s, --symbolic-link
    创建符号链接,而非拷贝
  
  -S, --suffic=SUFFIX
    覆盖常见的备份后缀
  
  -t, --target-directory=DIRECTORY
    拷贝所有 SOURCE 参数至 DIRECTORY 中

  -T, --no-target-directory
    将 DEST 作为普通文件对待
  
  -u, --update
    仅在 SOURCE 文件比目标文件新,或者目标文件丢失时才拷贝

  -v, --verbose
    解释发生了什么

  -x, --one-file-system
    保持在该文件系统中

  -Z
    将目标文件的 SELinux 安全上下文设置为默认

  --context[=CTX]
    与 -Z 相似,或指定了 CTX,则将 SELinux 或 SMACK 安全上下文设置为 CTX

  --help
    显示该帮助并退出
  
  --version
    输出版本信息并退出

默认情况下,松散(sparse)SOURCE 文件被 crude heuristic 发现,并且对应的 DEST 文件也会为松散状态。此也为 --sparse=auto 的状态
指定 --sparse=always,则无论 SOURCE 文件是否松散,都创建松散 DEST 文件。
指定 --sparse=never,则禁止创建松散文件。

当指定了 --reflink[=always],则执行轻量化拷贝,此时仅有修改过的数据块会被拷贝。若不可能则拷贝失败。
若指定了 --reflink=auto,当无法轻量化拷贝时,返回标准拷贝。
使用 --reflink=never 来保证使用标准拷贝。

备份文件的后缀名为 ~,除非用 --suffix 或者 SIMPLE_BACKUP_SUFFIX 指定。
可通过 --backup 或环境变量 VERSION_CONTROL 来选择版本控制的方式。下满为可选值:

none, off
永远不创建备份(即便使用了 --backup

numbered, t
使用数字编号备份

existing, nil
若存在数字编号备份则使用数字编号备份,否则使用简单备份

simple, never 永远创建简单备份

rm 删除文件或文件夹

rm [选项]... [文件]...

移除(unlink)文件。

  -f,--force
    忽略不存在的文件和选项,永不提示

  -i
    每次删除前均提示

  -I
    当一次性移除超过三个文件,或者递归移除前发出提示;比 -i 更安静,同时对大多数错误给出一定的保障机制。

  --interactive[=WHEN]
    基于 WHEN 来提示:never,once(-I)或者 always(-i);  
    若不指定 WHEN,使用 always

  --one-file-system
    当递归移除一个目录时,跳过任何与对应命令行参数不同的文件系统中的文件。

  --no-preserve-root
    不要特殊对待 根目录 /

  --preserve-root[=all]
    不要移除 根目录 /(默认值);与 all 连用时,拒绝任何命令行参数中与其父级不同的设备

  -r, -R, --recursive
    递归移除目录和它的内容

  -d, --dir
    移除空的文件夹

  -v, --verbose
    解释正在做的事情

  --heko
    显示这个帮助,并退出

  --version
    输出版本信息并退出

若要移除一个以 连字符 - 开头的文件,比如 -foo,可以使用以下命令

rm -- -foo
rm ./-foo

rm 并不保证文件的数据确实地从存储设备抹除了,要保证数据被安全地抹除,并无法被恢复,请使用 shred 命令

mv 移动(重命名)件名

mv [OPTION]... [-T] 源 目标
mv [OPTION]... 源... 目录
mv [OPTION]... -t 文件夹 源地址...

重命名 源 至 目标,或将 源 移动至 文件夹。

  --backup[=CONTROL]
    备份每个已经存在地目标文件

  -b
    同 --backup,但不接受参数

  -f, --force
    覆盖前不提示

  -i, --interactive
    覆盖前提示

  -n, --no-clobber
    不要覆盖一个已存在地文件

如果同时指定了 -i, -f, -n,仅最后一个参数起效

  --strip-trailing-slashes
    从每个源参数中移除任何尾随地斜线

  -S, --suffix=SUFFIX
    覆盖常用地备份后缀

  -t, --target-directory=DIRECTORY
    将所有 源 参数移动至 目录

  -T, --no-target-directory
    将 目标 当作普通文件

  -u, --update
    仅当 源 文件比 目标 文件新,或者目标文件不存在时才移动

  -v, --verbose
    解释发生了什么

  -Z, --context
    将目标文件地 SELinux 安全上下文内容设置为默认类型

  --help
    显示该帮助并退出

  --version
    输出版本信息并退出

备份后缀名为 波浪号 ~,除非使用 --suffix 或者 SIMPLE_BACKUP_SUFFIX 设置。
版本控制模式可以通过 --backup 选项或通过 VERSION_CONTROL 环境变量设置。
下面为可用地值:

none, off

从不备份(即便指定了 --backup)

numbered, t

使用编号备份

existing, nil

若存在编号备份则使用编号备份,否则使用简单备份

simple, never

永远使用简单备份

basename 从文件名中分离出目录和后缀

basename 名称 [后缀]
basename 选项... 名称...

打印出剥离了任何前序目录元素的 名称。若指定了 后缀,也一同移除后缀。

  -a, --multipile
    支持多参数,并将每个参数作为 名称

  -s, --suufix=SUFFIX
    移除了一个后缀 SUFFIX;隐含了 -a

  -z, --zero
    以 NUL,而非新行作为每行输出的结尾
  
  --help
    显示该帮助并退出
  
  --version
    输出版本信息并退出

dirname 从文件名中移除最后一个元素

dirname [选项] 名称...

输出每个移除了最后一个非斜线元素以及尾部斜线的 名称;若 名称 不包含 斜线 /,则输出 点号 .(意味着当前目录)

  -z, --zero
    以 NUL 而非 新行 作为每行输出的结尾

  --help
    显示该帮助,并退出

  --version
    输出版本信息,并退出

查看文件内容 cat/tac/nl/more/less/head/tail/od

cat [-AbEnTv] 输出文件内容 (Concatenate) -A,--show-all 输出文件的全部内容,包括特殊的字符 -b,--number-noblank 对非空行输出行号 -E,--show-ends 用 $ 标示行尾 -n,--number 输出所有行的行号 -T,--show-tabs 将所有的制表符显示为 ^I -v,--show-nonprinting 显示部分特殊符号

tac 从后像前打印

nl [-bnw] 输出文件并打印行号

-b 输出行号的方式 -b a 输出所有行号,即便是空行 -b t 输出非空行的行号(预设)

-n 输出行号的方式和位置 -n ln 行号左对齐,且不补0 -n rn 行号右对齐,且不补0 -n rz 行号右对齐,且补0

-w 补0的位数,默认为6

more 分页输出文件

空格键 向下翻一页 回车键 向下翻一行 :f 显示文件名和行数 b 向上翻一页

less 分页输出文件

注意: Linux 的 man 就是使用 less 进行分页浏览的,所以 less 的浏览按键就是 man 的浏览按键

空格键 向下翻一页 PageDown 向下翻一页 PageUp 向上翻一页 /<文字> 向下匹配文字 ?<文字> 向上匹配文字 n 沿着原来的匹配方向继续匹配文字 N 逆着原来的匹配方向继续匹配文字 g 前往文件的第一行 G 前往文件的最后一行 q 退出浏览

head/tail 输出文件的前几行/后几行

head [-n <行数>]

当行数 无符号 时,输出前N行的数据 当行数 带负号 时,输出除了后N的数据

tail [-f] [-n <行数>]

当行数 无符号 时,输出后N行的数据

当行数 带正号 时,输出除了前N行的数据

-f 指随时获取某个文件的更新数据,可用来追踪文件数据的变化

od 以二进制或八进制的方式输出文件

od [-t ] -t 指定将二进制文件以何种编码格式输出 -t a 使用预设字符输出 -t c 使用ACSII字符输出 -t d/f/o/x[size] 使用 十进制/浮点数/八进制/十六进制 来输出,每个 十进制/浮点数/八进制/十六进制 使用 n 个 byte 来计算

touch 修改文件时间 或者 建立新的文件

Linux 与文件相关的三个时间 (1) modification time (mtime) 文件 内容 被修改的时间 (2) status time (ctime) 文件 权限/属性 被修改的时间 (3) access time (atime) 文件 最后 被调用 的时间

touch [-acdmt]

-a 只修改 调用时间 -c, --no-create 不创建新文件 -d, --date= 使用指定的时间修改 -m 只修改 修改时间 -t 使用 [[CC]YY]MMDDhhmm[.ss] 的格式设置时间

umask 查看/设置 创建 新文件/新目录 时的默认权限(user mask)

umask [-S]

-S 用字符串显示用户的权限(非补码)

注意: umask 设置出来的码为权限的补码

第一位为 SUID/SGID/SBIT 权限

umask完整的 文件权限 为 666 ,也即 rw-rw-rw- umask完整的 目录权限 为 777 ,也即 rwxrwxrwx

注意!不可以使用 666 减去 umask 计算 文件 的权限,因为这会让文件看起来具有 可执行 的属性

eg. [eP@eptc ~]$ unmask #返回 0002 [eP@eptc ~]$ unmask -S #返回 u=rwx,g=rwx,o=rx

文件的隐藏属性(xfs文件系统下的)

设置隐藏属性

chattr [+-=][AadiS]

A 若有存取文件/目录,则该文件/目录的 atime 不变

a 文件内容只可以被追加,不可以被修改或删除

d 当 dump 程序运行时, dump 不对该文件备份

i 文件不可以被删除、重命名、建立链接、写入数据、修改数据

S 对文件的修改会实时写入硬盘中

显示文件隐藏属性

lsattr [-adR] -a 显示隐藏文件的属性 -d 只显示目录本身而非目录内容 -R 遍历目录下所有的文件

文件的特殊权限 SUID SGID SBIT

Set UID

某文件的 拥有者权限 的 可执行权限为 s ,则称这个文件具有 Set UID 权限

使用条件 1、SUID 仅对 二进制文件 有效 2、调用这个 二进制文件 的用户必须具有这个文件的 可执行权限

执行效果 1、调用文件的用户将在 该 二进制文件 执行过程中,临时获得该二进制文件 所有者 的身份

Set GID

某文件/某目录的 群组权限 的 可执行权限为 s ,则称这个文件具有 Set GID 权限

二进制文件的使用条件 1、调用这个 二进制文件 的用户必须具有这个文件的 可执行权限

二进制文件的执行效果 1、调用文件的用户将在 该 二进制文件 执行过程中,临时加入该二进制文件的 群组

目录的使用条件 1、当前用户对目录具有 rx 权限,可进入目录

目录的执行效果 1、当前用户在 当前目录 下的 有效群组 将变为 当前目录的 所属群组 2、当前用户若能在 当前目录 下创建新文件/新目录,则目录和文件的群组与 当前目录 的 所属群组 相同

Sticky Bit

某目录 的其他人权限 的 可执行权限为 t ,则称这个目录具有 Sticky Bit

目录的使用条件 1、当前用户对该目录具有 wx 权限,可写入目录

目录的执行效果 1、仅有 当前用户 和 root 才能 修改/删除 当前用户 创建的文件

SUID SGID SBIT 三者的数字依次为 4 2 1

file 检查文件类型

which 搜索 $PATH 下的可执行程序的绝对路径

whereis 在特定的路径下搜索文件 -l 罗列 whereis 会搜索的文件夹的路径 -b 只搜索二进制文件 -m 只搜索 man 文件 -s 只搜索 源码文件 -u 只搜索除上述三种文件之外的文件

locate 通过部分文件名搜索文件所在路径 -i 忽略大小写 -c 仅输出找到的文件数量 -l 仅输出n行 -S 输出 locate 自身数据库的信息 -r 用正则表达式定义输出的样式

注意, locate 只搜寻 /var/lib/mlocate/mlocate.db 文件中的记录数据,所以搜寻速度非常快 /etc/updatedb.conf 定义 mlocate.db 数据的获取的范围 而获取数据的动作由 updatedb 这个命令来执行, CentOS7 默认一天执行一次

所以可以手动执行 updatedb 来强制刷新 locate 数据库

find 搜索文件 find [path] [option] [action]

(0) 排除匹配上某个参数的文件 在参数之前加 感叹号 !

EG. find . ! -name "*.c" # 查找不以 .c 作为结尾的文件

(1) 与时间相关的参数 -[ctime|atime|mtime] [无/+/-] [天数] -newer file

针对文件的 ctime/atime/mtime 搜寻 <1>【不加符号】第n天前的那一天变动过的文件 <2>【+号】第 n 天之前(不含 n 天)变动过的文件 <3>【-号】第 n 天之内(含 n 天)变动过的文件 <4>【 newer 】比指定文件要新的文件

(2) 与用户或群组相关的参数 -uid n 寻找用户编号(GID)为 n 的文件 -gid n 寻找群组编号(GID)为 n 的文件 -user name 寻找用户名为 name 的文件 -group name 寻找群组名为 name 的文件 -nouser 寻找不被记录在 /etc/passwd 中用户的文件 -nogroup 寻找不被记录在 /etc/group 中用户的文件

(3) 与文件名称以及权限相关的参数 -name filename 搜索文件名为 filename 的文件 -size [+-]Size 搜索比 Size 要大(+)或小(-)的文件,大小后缀 c 表示 byte,大小后缀 k 表示 kbyte -type Type 搜索文件类型为 正常文件(f),设备文件(b,c),目录(d),链接(l),套字节(s),FIFO(p) -perm mode 搜索权限恰好为 mode 的文件 -perm -mode 搜索权限包含 mode 的文件 -perm /mode 搜索权限部分具有 mode 的文件

eg.

find -perm 0744 #只搜索权限为 0744 的文件 find -perm -0744 #搜索权限包含 0744 的文件,比如 4744、0755、4755 等的文件 find -perm /0744 #搜索权限部分具有 0744 的文件,比如 0200、0203 等的文件

(4) 额外的参数 -exec [command] {} ; 其中 [command] 为需要执行的命令 {} 代表搜寻到的文件序列 ; 输入一个分行符,结束这个命令

eg.

从 exfat 文件系统上拷贝文件至本地,会默认开启可执行权限,快速修改方法

find . -perm -0777 -exec chmod 0644 {} ;

eg2.

仅查找当前目录下的普通文件,并移动至子目录下

find . -maxdepth 1 -type f -exec mv {} subdir ;