首页 > 代码库 > 几个常用命令:df、dd、du、locate、find
几个常用命令:df、dd、du、locate、find
df命令:
df - report file system disk space usage
df [OPTION]... [FILE]...
-h, --human-readble:单位转换
-l, --local:只显示本地文件系统,不显示网络文件系统
-i, --inodes:显示inode使用状态
-T, --print-type:显示文件系统类型
-P, --portability:使用POSIX输出格式,更易于阅读
使用这个命令可以显示当前系统中的磁盘使用信息,使用的是默认的单位KB
[root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vg_localhost-lv_root 51475068 6523056 42330572 14% / tmpfs 1857540 72 1857468 1% /dev/shm /dev/sda1 487652 43139 418913 10% /boot /dev/mapper/vg_localhost-lv_home 424688000 93992 403014440 1% /home [root@localhost ~]#
因为只使用df命令显示出来的单位是KB,不易我们查看,所以可以加上“-h”选项,将显示的单位改为易读的单位:
[root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_localhost-lv_root 50G 6.3G 41G 14% / tmpfs 1.8G 72K 1.8G 1% /dev/shm /dev/sda1 477M 43M 410M 10% /boot /dev/mapper/vg_localhost-lv_home 406G 92M 385G 1% /home [root@localhost ~]#
在日常的使用过程中,有的时候需要知道分区的文件系统,此时可以使用“-T”选项:
[root@localhost ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_localhost-lv_root ext4 50G 6.3G 41G 14% / tmpfs tmpfs 1.8G 72K 1.8G 1% /dev/shm /dev/sda1 ext4 477M 43M 410M 10% /boot /dev/mapper/vg_localhost-lv_home ext4 406G 92M 385G 1% /home [root@localhost ~]#
如果只想查看文件系统类型为ext4的分区,可以使用“-t”或者“--type=ext4”选项:
[root@localhost ~]# df -t ext4 Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vg_localhost-lv_root 51475068 6523088 42330540 14% / /dev/sda1 487652 43139 418913 10% /boot /dev/mapper/vg_localhost-lv_home 424688000 93992 403014440 1% /home [root@localhost ~]#
以上的选项都是对块进行显示,也可以使用这个命令来显示inode的使用情况,用法是加上“-i”选项:
[root@localhost ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/vg_localhost-lv_root 3276800 119567 3157233 4% / tmpfs 464385 3 464382 1% /dev/shm /dev/sda1 128016 39 127977 1% /boot /dev/mapper/vg_localhost-lv_home 26976256 534 26975722 1% /home [root@localhost ~]#
在上面的例子中,我们可以发现格式并没有完全的按照表格来,所以显得有些乱,此时可以使用“-P”选项:
[root@localhost ~]# df -hTP Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_localhost-lv_root ext4 50G 6.3G 41G 14% / tmpfs tmpfs 1.8G 72K 1.8G 1% /dev/shm /dev/sda1 ext4 477M 43M 410M 10% /boot /dev/mapper/vg_localhost-lv_home ext4 406G 92M 385G 1% /home [root@localhost ~]#
dd命令:convert and copy a file
我认为这个命令对我最大的帮助就是可以让我随意的创建一个任意大小的文件
dd [OPERAND]...
dd OPTION
常见的OPERAND:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=BYTES:block size, 复制单元大小
count=N:复制多少个bs
of=FILE:写到所命名的文件而不是到标准输出
if=FILE:从所命名文件读取而不是从标准输入
ibs=BYTES:一次读size个byte
obs=BYTES:一次写size个byte
skip=BLOCKS:从开头忽略blocks个ibs大小的块
seek=BLOCKS:从开头忽略blocks个obs大小的块
conv=conversion[,conversion...]:用指定的参数转换文件。
转换参数:
ascii:转换EBCDIC为ASCII。
ebcdic:转换ASCII为EBCDIC。
block:把每一行转换为长度为cbs的记录,不足部分用空格填充。
unblock:使每一行的长度都为cbs,不足部分用空格填充。
lcase:把大写字符转换为小写字符。
ucase:把小写字符转换为大写字符。
swab:交换输入的每对字节。
noerror:读取出错时继续读取。
notrunc:不截短输出文件。
sync:把每个输入块填充到ibs个字节,不足部分用空(NULL)字符补齐
一些常用的方法如下:
磁盘拷贝:
~]# dd if=/dev/sda of=/dev/sdb
备份MBR:
~]# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader:
~]# dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
有二进制文件fileA,size>2K。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,请问如何实现?
~]# dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
备份:
将本地的/dev/sdx整盘备份到/dev/sdy
~]# dd if=/dev/sdx of=/dev/sdy
将/dev/sdx全盘数据备份到指定路径的image文件
~]# dd if=/dev/sdx of=/path/to/image
备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
~]# dd if=/dev/sdx | gzip >/path/to/image.gz
恢复:
将备份文件恢复到指定盘
~]# dd if=/path/to/image of=/dev/sdx
将压缩的备份文件恢复到指定盘
~]# gzip -dc /path/to/image.gz | dd of=/dev/sdx
拷贝内存资料到硬盘
将内存里的数据拷贝到root目录下的mem.bin文件
~]# dd if=/dev/mem of=/root/mem.bin bs=1024
从光盘拷贝iso镜像
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
~]# dd if=/dev/cdrom of=/root/cd.iso
销毁磁盘数据
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行。
~]# dd if=/dev/urandom of=/dev/sda1
得到最恰当的block size
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
~]# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file ~]# dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file ~]# dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file ~]# dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
测试硬盘读写速度
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度
~]# dd if=/root/1Gb.file bs=64k | dd of=/dev/null ~]# dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
修复硬盘
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。
~]# dd if=/dev/sda of=/dev/sda
du命令,这个命令的功能和df类似,也是查看使用空间,但是这个命令是针对文件和目录来进行查看,df命令是针对磁盘来进行查看:
du - estimate file space usage
du [OPTION]... [FILE]...
-s, sumary,:显示整个目录汇总的文件大小
-h, human-readble:单位转换
-a或-all 显示目录中个别文件的大小。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k或--kilobytes 以KB(1024bytes)为单位输出。 -m或--megabytes 以MB为单位输出。
-s或--summarize 仅显示总计,只列出最后加总的值。 -h或--human-readable 以K,M,G为单位,提高信息的可读性。
-x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
-S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
-X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
--exclude=<目录或文件> 略过指定的目录或文件。
-D或--dereference-args 显示指定符号链接的源文件大小。
-H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
-l或--count-links 重复计算硬件链接的文件。
使用这个命令可以统计文件的大小,比如统计根目录“/”的大小(如果没有“-s”选项,则会将根目录下的所有目录进行统计):
[root@localhost ~]# du -s / du: 无法访问"/proc/3895/task/3895/fd/4": 没有那个文件或目录 du: 无法访问"/proc/3895/task/3895/fdinfo/4": 没有那个文件或目录 du: 无法访问"/proc/3895/fd/4": 没有那个文件或目录 du: 无法访问"/proc/3895/fdinfo/4": 没有那个文件或目录 6533337/ [root@localhost ~]#
在最后一行显示的一串数字就是根目录的大小,但是这样不方便我们进行观察,所以可以加上“-h”选项:
[root@localhost ~]# du -sh / du: 无法访问"/proc/3884/task/3884/fd/4": 没有那个文件或目录 du: 无法访问"/proc/3884/task/3884/fdinfo/4": 没有那个文件或目录 du: 无法访问"/proc/3884/fd/4": 没有那个文件或目录 du: 无法访问"/proc/3884/fdinfo/4": 没有那个文件或目录 6.3G/ [root@localhost ~]#
locate命令:在使用Linux的时候,有的时候想不起来一个文件放在哪里,那么就可以使用查找操作来找到想要的文件。查找的命令有很多,第一个说一说locate命令,这个命令是模糊查找,也可以说是贪婪模式下的查找,会找到所有匹配到的内容,比如想要找“a”这个文件,但是使用这个命令之后会将所有包含“a”字母的文件显示出来。这个命令基于专用的数据库进行查找,数据库应该事先创建,并且定期更新,我们可以使用updatedb命令手动更新locate数据库。由于不用去遍历目录,而只需要查找数据库,所以查找速度非常快,但是查找精确度非常有限,因为如果新创建了一个文件,却没有在数据库中更新,那么就查不到这个文件,只有当更新数据库后才能查到,使用的方法是直接在命令后跟上要查找文件的名字:locate fileName。所以如果要使用这个命令就需要定期更新,可以使用updatedb命令手动更新locate数据库。
find命令:和locate命令相对的是find命令,这个命令是精确查找,在指定的位置进行文件名或文件属性的遍历扫描,所以强烈不建议对根目录进行find操作,因为查找的时间会特别长,而这个命令是实时查找,因此就会面临一个问题,当执行了查找操作时如果另外一个用户登陆,将这个文件删掉了,那么就会查找出错了,所以在使用这个命令的时候断网查找。在使用find命令时只能搜索当前用户具有读取和执行权限的目录,就像一个普通用户是不能访问系统配置文件一样。find命令的具体用法如下:
find命令:
find - search for files in a directory hierarchy
find [OPTIONS...] [查找路径] [查找条件] [处理动作]
查找路径:默认为当前工作目录,可以指定具体的目录路径;
查找条件:进行本次搜索的标准,可以是文件名、文件大小、文件类型、文件权限等等;默认是指定目录中的所有文件;
处理动作:对于符合条件的文件进行某个处理操作;默认将查找结果输出到显示器;
根据文件名查找:
-name 文件名称,支持使用Globbing,(*, ?, [], [^])
-iname 文件名称,忽略字母大小写,支持使用Globbing,(*, ?, [], [^])
根据文件的inode编号查找:
-inum inode编号:通过给定的inode编号查找对应的文件名及路径;
-samefile name:通过给定的文件名查找对应的inode编号,进而确定所有具有该inode编号的文件名及路径;
-links n:查找链接数为n的所有文件;
根据正则表达式查找:
-regex pattern:以pattern匹配整个文件路径字符串,而不仅仅是给定文件的名称;
根据文件的属主和属组进行查找:
-user uname:根据属主为指定用户的用户名进行查找
-uid UID:根据属主为某个UID进行查找
-group gname:
-gid GID:
-nogroup:在文件的属组上没有组对应的组名;
-nouser:在文件的属主上没有用户对应的用户名;
根据文件的类型查找:
-type 文件类型:
b:块设备
c:字符设备
d:目录文件
f:普通文件
l:符号链接文件
p:管道文件
s:套接字文件
-xtype 文件类型:符号链接文件的匹配需要配合其他的选项;
根据时间戳进行查找:
以天为单位:
-atime [+|-]n:根据访问时间查找
-ctime [+|-]n:根据改变时间查找
-mtime [+|-]n:根据修改时间查找
n:[n,n+1)
+n:[n+1,+∞)
-n:[now,n)
以分钟为单位:
-amin [+|-]n
-cmin [+|-]n
-mmin [+|-]n
例子:
5-28-11-18
-mtime -3
5-25-11-18
-mtime 3
5-24-11-18
-mtime +3
根据文件的大小进行查找:
-size [+|-]n[cwbkMG]
n:(n-1,n]
-n:[0,n-1]
+n:(n,+∞)
例子:
find -size +2k
当前目录下所有大于2KB的文件;
find -size 2k
当前目录下所有1KB-2KB之间的文件;
find -size -2k
当前目录下所有小于1KB的文件;
组合条件:
-a:逻辑与,默认可以省略;
-o:逻辑或
-not, !:逻辑非
逻辑组合条件遵循德摩根定律:
非(A 与 B) == 非A 或 非B
非(A 或 B) == 非A 与 非B
根据权限查找:
-perm [/|-]mode
mode:精确匹配指定的权限
/mode:隐含了逻辑或的关系,任何一个权限位的权限中只要能有一个权限匹配,即可满足条件;
-mode:隐含了逻辑与的关系,每一个权限位的权限中都必须同时包含指定权限位,才能满足条件;
所有都有 取反 任意一个没有
! ( a与b与c ) = !a 或 !b 或 !c
所有都没有 取反 任意一个有
! ( !a与!b与!c ) = a 或 b 或 c
处理动作:
-print:输出到显示屏幕,默认的动作;
-ls:对与查找到的结果执行ls -li命令显示;
-exec COMMAND {} \;:
-ok COMMAND {} \;:
对于查找到的结果执行COMMAND命令;
区别:
-exec是非交互式的;
-ok是交互式的;
{}:占位符,用来引用被find命令查找到的所有的文件的路径信息;
-exec和-ok的取代执行操作:
chmod a-r $(find -perm -444 -type f)
find -perm -444 -type f | xargs chmod a-r
注意:管道输送的是纯字符串信息,所以如果管道之后的命令不是处理字符串的命令,需要使用xargs命令将其转换成能够被后面命令处理的参数;
下面是来自: http://man.linuxde.net/find的一些例子:
根据文件或者正则表达式进行匹配
列出当前目录及子目录下所有文件和文件夹
find .
在/home目录下查找以.txt结尾的文件名
find /home -name "*.txt"
同上,但忽略大小写
find /home -iname "*.txt"
当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)
或
find . -name "*.txt" -o -name "*.pdf"
匹配文件路径或者文件
find /usr/ -path "*local*"
基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"
同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"
否定参数
找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"
根据文件类型进行搜索
find . -type
类型参数
类型参数列表:
f 普通文件
l 符号连接
d 目录
c 字符设备
b 块设备
s 套接字
p Fifo
基于目录深度搜索
向下最大深度限制为3
find . -maxdepth 3 -type f
搜索出深度距离当前目录至少2个子目录的所有文件
find . -mindepth 2 -type f
根据文件时间戳进行搜索
find . -type f
时间戳
UNIX/Linux文件系统每个文件都有三种时间戳:
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
搜索最近七天内被访问过的所有文件
find . -type f -atime -7
搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7
搜索超过七天内被访问过的所有文件
find . -type f -atime +7
搜索访问时间超过10分钟的所有文件
find . -type f -amin +10
找出比file.log修改时间更长的所有文件
find . -type f -newer file.log
根据文件大小进行匹配
find . -type f -size
文件大小单元:
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节
搜索大于10KB的文件
find . -type f -size +10k
搜索小于10KB的文件
find . -type f -size -10k
搜索等于10KB的文件
find . -type f -size 10k
删除匹配文件
删除当前目录下所有.txt文件
find . -type f -name "*.txt" -delete
根据文件权限/所有权进行匹配
当前目录下搜索出权限为777的文件
find . -type f -perm 777
找出当前目录下权限不是644的php文件
find . -type f -name "*.php" ! -perm 644
找出当前目录用户tom拥有的所有文件
find . -type f -user tom
找出当前目录用户组sunk拥有的所有文件
find . -type f -group sunk
借助-exec选项与其他命令结合使用
找出当前目录下所有root的文件,并把所有权更改为用户tom
find .-type f -user root -exec chown tom {} \;
上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
找出自己家目录下所有的.txt文件并删除
find $HOME/. -name "*.txt" -ok rm {} \;
上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
-exec ./text.sh {} \;
搜索但跳出指定的目录
查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
find . -path "./sk" -prune -o -name "*.txt" -print
find其他技巧收集
要列出所有长度为零的文件
find . -empty
几个常用命令:df、dd、du、locate、find