常用命令--文件目录

包括文件和目录的查看、创建、修改、删除等一系列相关操作内容

ls

ls [OPTION]... FILE...

List 显示目标列表

-a:显示所有文件及目录
-l:长格式显示
-h:人性化显示大小
-d:仅显示目录名,而不显示目录下的内容列表
-A:显示除“.”和’..’外的所有
-i:显示inode节点号
-R:递归(recursive)显示

1
ls -ahil /root

pwd

pwd [OPTION]...
Print Working Directory 显示当前所在工作目录

$PWD:环境变量用来记录当前目录
$OLDPWD:记录上次目录,如果没切换时则不存在

cd

Change Diretory 切换目录

  • cd :进入用户主目录
  • cd ~ :进入用户主目录
  • cd - :返回进入此目录之前所在的目录
  • cd .. :返回上级目录
  • cd ../.. :返回上两级目录

cp

cp [OPTION]... SRC DEST
复制文件

-r:递归处理,将指定目录下的所有文件与子目录一并处理
-i:覆盖既有文件之前先询问用户
-f:强行复制文件或目录,不论目标文件或目录是否已存在
-p:保留源文件或目录的属性
-a:归档复制,常用于备份

1
2
# 将/home/liu目录下的所有文件目录包括隐藏文件,一同复制到/tmp目录下,将 '.' 换成 '* '时将不复制隐藏文件  
cp -rf /home/liu/. /tmp

mv

mv [OPTION]... SOURCE... DIRECTORY
移动或重命名文件目录

1
2
mv /test/* .       # 移动/test/目录下的所有文件到当前目录
mv a.txt b.txt # 重命名a.txt为b.txt

rm

rm [OPTION]... FILE...
删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变,使用时必须小心

-f:强制删除文件或目录
-i:删除已有文件或目录之前先询问用户
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理
-d:直接把欲删除的目录的硬连接数据删除成0,删除该目录
--preserve-root:不对根目录进行递归操作
-v:显示指令的详细执行过程

1
rm -rf /test/aa/*   # 删除/test/aa/目录下的所有文件目录,但不包括隐藏文件

touch

touch [OPTION]... FILE...
修改文件时间或者创建文件

-a:修改访问时间
-m:修改文件修改时间
-d DTEATE:设定时间与日期,可以使用各种不同的格式
-r FILE:把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同
-t STAMP:设定时间戳,包括atime,mtime,时间格式: [[CC]YY]MMDDhhmm[.SS](年月日时分秒)
-c:不创建任何文件

1
2
3
touch a.txt                     # 创建文件
touch -t 20160521234512 a.txt # 修改时间戳
touch -r a.txt b.txt # 测试创建

mkdir

mkdir [OPTION]... DIRECTORY...
创建目录

-m:指定权限
-p:递归创建多级目录
-v:显示创建过程信息

1
2
mkdir -m 755 /tmp/test  
mkdir -pv /tmp/testdir/{a,b}_{m,n} # 先创建/tmp/testdir/,再在其目录下创建a_m, a_n, b_m, b_n目录

mktemp

mktemp [OPT] [TEMPLATE]
创建临时目录或文件

-d:创建目录
-u:不产生实际目录或文件,主要用于测试是否可以创建

1
mktemp /tmp/mytemp.XXX      # X至少3个以上,生成时用随机字母代替

file

file [OPTION]... FILE...
检测文件类型,多个文件之间用空格

-b:列出结果不显示文件名

1
file /usr/bin/passwd

stat

stat [OPTION]... FILE...
显示文件状态信息,包括大小、节点号、权限、访问修改时间等元数据内容

-t:以简洁方式输出信息
-L:支持符号连接
-f:显示文件系统状态而非文件状态

1
stat /etc/passwd

tree

tree [OPTION]... Directory...
以树形方式显示指定目录下的所有文件,包括子目录下的文件

-a:所有文件以目录树的格式显示,默认
-d:所有的目录以树状形式显示
-g:列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码
-L NUM:显示目录层级数
-l:当显示的目录或文件问链接是,则同时显示源文件
-p:显示文件或目录的权限
-s:显示文件或目录大小
-u:显示文件或目录的所属主

1
2
tree /etc/rc.d/
tree -agu -L 1 ~

which

which [options] [--] programname [...]
查找可执行的程序文件,并且只能在环境变量$PATH定义的目录中查询

1
which pwd

whereis

查找程序文件文件的位置、文件的源代码、文件的说明手册

1
whereis cat

ln

硬链接:ln [参数] 源文件 目标文件
软链接:ln -s [源文件或目录] [目标文件或目录]

1
2
3
4
5
# 为log2.log创建硬链接ln2,log2.log与ln2的各项属性相同
ln log2.log ln2

# 目录创建链接必须用绝对路径,相对路径创建会不成功,会提示:符号连接的层数过多 这样的错误 创建指向/opt/soft/test/test3的符号链接/opt/soft/test/test5/test3
ln -sv /opt/soft/test/test3 /opt/soft/test/test5

locate

locate [OPTION]... PATTERN...
查找文件或目录,其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库,但比较消耗资源

-b:只匹配基名
-c:统计数量

1
locate -bc issue

find

find [OPTION] [查找起始路径] [查找条件] [处理动作]
查找起始路径:默认当前目录,可以多个路径
处理动作:如删除等,默认输出至屏幕

查找条件
-name PATTERN:根据文件名查找(-iname不区分大小写),支持glob通配符
-user USERNAME:所属用户(-nouser 没有所属用户)
-group GROUP:所属组 (-nogroup 没有所属组文件)
-type TYPE:类型(f, d, l, b, c, p, s)
-size [+|-] #UNIT(单位k, M, G)
-empty:文件为空而且是一个普通文件或目录
-atime [+|-] #:访问时间,以天为单位(-mtime修改, -ctime改变)
-amin [+|-] #:(-mmin, -cmin)以分钟为单位
-executable|-readable|writable:可执行/读/写
-samefile FILE:查找与FILE文件的硬链文件
-perm [/|-]MODE:按权限查找,权限表示如下

644:指定644权限
/755:任一类用户任一位(rwx)合即可==>”或””
-222:每一类用户权限每一位(rwx)都同时符合==>”与”
u=rw,g=r,o=r:等同644

处理动作
-ls:类似对查找的结果使用ls -l命令(如前条件为或关系,需加括号)
-fls FILE:ls -l的结果写入文件
-delete:删除找到的文件
-ok COMMAND {} \;:对每个结果执行命令,每次需要确认
-exec** COMMAND {} **\;:对每个结果统一执行命令,无需确认

说明;为find做标记,由find来解析,确保参数是传递给find还是COMMAND,由于分号在bash有特殊意义所以需要转义,{}表示find找到的结果,COMMAND常见有cp, rm等

-a:与,默认可省
-o:或
-not:非,也可用!

  • 大小
    #UNIT:(#,#-1]
    -#UNIT:[0,#-1]
    +#UNIT:(#,+oo)
  • 时间(当前时间前,正整数)
    #:[#,#-1)
    -#:(#,0]
    +#:(oo,#-1]
1
2
3
4
5
6
7
8
9
10
# 当前目录下以file开头后接至少一个字母数字的文件
find . -iname "file[[:alnum:]]"
# 所属主非root,文件名不含fs且大于15k的文件 **括号要转义且前后有空格**
find /tmp -not \\( -user root -o -not -name "\*fs*" \\) -a -type f -size +15k -ls
# 找其它用户有写权限的文件,并在文件名后加.bak
find . -perm /002 -exec cp {} {}.bak \;
# 至少一类用户没有执行权限的文件
find /tmp -not -perm -111 -type -f -ls
# 系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root
find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

xargs

一个非常神奇但容易被忽略的命令,find..xargs 效率比 find..exec 高出很多

-d: 指定分割符,默认是空格
-n: 命令在执行的时候一次用的个数,默认是用所有的
-L: 从标准输入一次读取 num 行送给命令执行
-0: 如文件名可能包含空格这样就不适合处理,此参数表示用 null 当作分隔符
-i: 将每个参数一个一个的传递过去,用 {} 代替
-I: 指定赋值,-i 默认是 {}
-p: 每次执行前询问
-P: 最大进程数,默认 1 个进程
-t: 打印出执行的命令再执行
-a: 从指定文件中读入作为输入
-E: 指定结束位置,只有在xargs不指定-d的时候有效,如果指定了则不起作用

1
2
3
4
5
6
echo 1 2 3 | xargs -t mkdir
echo 'one two three' | xargs -p touch
echo 'qw1er1ty1u' | xargs -d1 -n2
find . -name '*.txt' -print0 | xargs -0 -I % mv % %.bk
find . -name '*.txt' | xargs -i -t mv {} {}.bk
time echo {1..4} | xargs -P4 -n 1 sleep

dd

转换或复制文件,是一个较为底层级别的复制

if=/PATH_SRC:源
of=/PATH_DEST:目标
bs=#[MGTPEZY]:复制单元大小,不加单位为字节数
count=#:复制几个bs
seek=#: 跳过多少of的空间
skip=#: 跳过多少if的空间

1
2
3
4
5
6
dd if=/dev/sda of=/dev/sdb                          # 拷贝整个磁盘
dd if=/dev/sda of=/tmp.mbr.bak bs=512 count=1 # 备份MRB信息
dd if=/dev/zero of=/dev/sda bs=256 count=1 # 破坏MBR中的Bootloader,*/dev/zero 可以源源不断产生0;/dev/null 数据黑洞*
dd if=/dev/sda | gzip > file.gz # 复制并压缩
dd if=/dev/sda of=/dev/sda # 修复硬盘
dd if=/dev/zero of=/tmp/swapfile seek=2047 bs=1M count=2048 # 创建2G大小的文件,用来做临时swap分区使用(mkswap, swapon)

gzip

gzip file
gunzip file.gz
zcat file.gz
将文件压缩为.gz格式,只能压缩文件,压缩后删除原文件,zcat不解压查看文本内容

-d: 解压,同gunzip
-#: 1-9,指定压缩比,默认是6
-c: 将压缩结果输出至标准输出

bzip2

bzip file
bunzip file.bz2
bcat file.bz2
将文件压缩为.bz2格式,压缩比高于.gz,只能压缩文件,默认压缩后删除原文件,bcat不解压查看文本内容

-d: 解压,同bunzip
-#: 1-9,指定压缩比,默认是6
-k: 压缩时保留原文件

xz

xz file
unxz file.xz
xzcat file
将文件压缩为.xz格式,压缩比高于.bz2,只能压缩文件,默认压缩后删除原文件,xzcat不解压查看文本内容

-d: 解压,同unxz
-#: 1-9,指定压缩比,默认是6
-k: 压缩时保留原文件

zip

zip file.zip file1 file2...
unzip file.zip
zip是种既归档又压缩的工具,可压缩目录或多个文件,默认不会删除原文件

tar

tar [OPTION] FILE...
归档工具(archive),同时可以调用压缩归档文件为指定压缩格式

-c: 创建归档文件
-x: 展开归档
-f FILE.tar: 操作的归档文件
-v: 显示操作过程
-t: 不展开归档,直接查看归档了哪些文件
-p: 保留备份数据的原本权限和属性
-r: 向tar包(未压缩)中添加文件
--xattrs: 归档时,保留文件的扩展属性信息

  • -zcvf: 归档并调用gzip压缩
  • -jcvf: 归档并调用bz2压缩
  • -Jcvf: 归档并调用xz压缩
  • -xf: 解压文件,默认会自动识别各种压缩格式
  • -C /PATH: 指定解压路径

备注:tar命令的选项前的’-‘可以省略

1
2
3
4
tar zcvf test.tar.gz file1 file2...   	# 压缩多个文件,可以为目录
tar xf test.tar.gz -C /tmp # 解压文件,默认会自动识别各种压缩格式,指定路径
tar tf test.tar.gz # 只查看不解压
tar rf test.tar a b # 向tar包中添加文件

rz/sz

使用SecureCRT或者Xshell等客户端工具连接Linux的上传下载工具,软件包为lrzsz

  1. 上传 rz(服务器端recieve,相当于上传)
  2. 下载 sz

备注

  1. access time是文档最后一次被读取的时间。因此阅读一个文档会更新它的access时间,但它的modify时间和change时间并没有变化。cat、more 、less、grep、sed、tail、head这些命令都会修改文件的access时间。
  2. modify time是文本本身的内容发生了变化。[文档的modify时间也叫时间戳(timestamp).] ls命令看到的是modify time。用vi等工具编辑一个文件保存后,modify time会被修改。
  3. change time是文档的索引节点(inode)发生了改变(比如位置、用户属性、组属性等)。chmod, chown,create,mv等动作会将Linux文件的change time修改为系统当前时间。
  4. 硬链接:通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(InodeIndex)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。以文件副本的形式存在。它会在你选定的位置上生成一个和源文件大小相同的文件,但不占用实际空间。不允许给目录创建硬链接,只有在同一个文件系统中才能创建
  5. 软链接:一个特殊的文件,它的内容不是真正的数据,而是指向另一个文件(链接目标)的路径名。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。对符号链接的大部分操作,包括打开、读、写等,都被传递给其链接目标,操作真正作用在链接目标上,另外一些操作,如删除等则作用在符号链接本身。以路径的形式存在。类似于Windows操作系统中的快捷方式可以对目录进行链接。必须使用绝对路径,软链接可以对一个不存在的文件名进行链接,可以跨文件系统