Mac find命令汇总 & 显示隐藏文件操作
mac显示隐藏文件
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
或者
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles NO
输完单击Enter键,退出终端,重新启动Finder就可以了
重启Finder:鼠标单击窗口左上角的苹果标志-->强制退出-->Finder-->重新启动
Find 命令汇总
文件查找
缓存文件夹清理(s-store/tmp为例)
#1 将tmp中超过15天的文件 移动到 s-store-copys/tmp文件夹中命令:
cd /xxx/xxx/s-store/tmp
sudo find ./ -name "*.png" -mtime +15 -exec mv {} ../../s-store-copys/tmp \;
sudo find ./ -name "*.jpg" -mtime +15 -exec mv {} ../../s-store-copys/tmp \;
sudo find ./ -name "*.jpeg" -mtime +15 -exec mv {} ../../s-store-copys/tmp \;
sudo find ./ -name "*.PNG" -mtime +15 -exec mv {} ../../s-store-copys/tmp \;
sudo find ./ -name "*blob" -mtime +15 -exec mv {} ../../s-store-copys/tmp \;
sudo find ./ -name "*.JPG" -mtime +15 -exec mv {} ../../s-store-copys/tmp \;
打包压缩
-
压缩单个文件:
tar -zcvf log.tar.gz 20_02_17Log.log
-
压缩批量文件:
#1. 将3天以外的log 移动到history
sudo find ./ -maxdepth 1 -name "*.log" -mtime +3 -exec mv {} history \;
#2. 去到history
cd history/
#3. 压缩打包
tar -zcvf 20200117_20200215log.tar.gz *.log
#4. 删除history中的log
rm -rf *.log
#5. 查看剩余空间
df -h
批量移动/删除文件:
#1 删除60天之外的所有.log文件:
sudo find ./ -maxdepth 1 -name "*.log" -mtime +60 -exec rm -rf {} \;
#2 find 命令
#2.1 当前目录下 .log 结尾的文件: ./ -name "*.log"
#2.2 60天之外的: -mtime +60
#2.3 对查找结果 执行的操作: -exec rm -rf {} \
#3 移动15天之外的日志:
sudo find ./ -maxdepth 1 -name "*.xls" -mtime +7 -exec mv {} history \;
sudo find ./ -maxdepth 1 -name "*.log" -mtime +15 -exec mv {} ./histories \;
文件搜索:
#1 查找文件 查找当前目录下面的Develop文件
find Develop
find ./ Develop
#2.查找文件 当前目录以及子目录下面的Github文件 (-iname 忽略大小写)
find ./ -name Github
find ./ -name Gith*
#例子
192:~ jojol$ find ./ -name Github
192:liliping root# find ./ -name Nexus_5*
.//.android/avd/Nexus_5_API_23.avd
.//.android/avd/Nexus_5_API_23.ini
#3.查找文件夹 当前目录以及子目录下面的GitHub 文件夹
find ./ -name Github -type d
#4.查找当前目录以及子目录下面带Github关键字的路径
find ./ |grep Github
192:liliping root# find ./|grep Nexus_5
.//.android/avd/Nexus_5_API_23.avd
.//.android/avd/Nexus_5_API_23.avd/cache.img
.//.android/avd/Nexus_5_API_23.avd/config.ini
.//.android/avd/Nexus_5_API_23.avd/emulator-user.ini
.//.android/avd/Nexus_5_API_23.avd/hardware-qemu.ini
内容查找
grep [选项] '匹配字符串' 文本文件
grep –i '匹配字符串' 文本文件 #忽略需要匹配字符串中的大小写
grep -i 'Root' /etc/passwd
grep ‘word$‘ 文本文件 #将以word结尾的行全部显示出来
find [目录] [条件1] [条件2] [条件3]……
linux下的find文件查找命令与grep文件内容查找命令
linux下的find文件查找命令与grep文件内容查找命令
在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。
区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。
一.find命令
**基本格式:**find path expression
1.按照文件名查找
(1)find / -name httpd.conf #在根目录下查找文件httpd.conf,表示在整个硬盘查找
(2)find /etc -name httpd.conf #在/etc目录下文件httpd.conf
(3)find /etc -name 'srm' #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件
(4)find . -name 'srm*' #表示当前目录下查找文件名开头是字符串‘srm’的文件
2.按照文件特征查找
(1)find / -amin -10 # 查找在系统中最后10分钟访问的文件(access time)
(2)find / -atime -2 # 查找在系统中最后48小时访问的文件
(3)find / -empty # 查找在系统中为空的文件或者文件夹
(4)find / -group cat # 查找在系统中属于 group为cat的文件
(5)find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件(modify time)
(6)find / -mtime -1 #查找在系统中最后24小时里修改过的文件
(7)find / -user fred #查找在系统中属于fred这个用户的文件
(8)find / -size +10000c #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
(9)find / -size -1000k #查找出小于1000KB的文件
3.使用混合查找方式查找文件
参数有: !,-and(-a),-or(-o)。
(1)find /tmp -size +10000c -and -mtime +2 #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件
(2)find / -user fred -or -user george #在/目录下查找用户是fred或者george的文件文件
(3)find /tmp ! -user panda #在/tmp目录中查找所有不属于panda用户的文件
二、grep命令
**基本格式:**find expression
1.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-i:不区分大小写
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
<:从匹配正则表达 式的行开始。
>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
.:所有的单个字符。
* :有字符,长度可以为0。
2.实例
(1)grep 'test' d* #显示所有以d开头的文件中包含 test的行
(2)grep ‘test’ aa bb cc #显示在aa,bb,cc文件中包含test的行
(3)grep ‘[a-z]{5}’ aa #显示所有包含每行字符串至少有5个连续小写字符的字符串的行
(4)grep magic /usr/src #显示/usr/src目录下的**文件(不含子目录)**包含magic的行
(5)grep -r magic /usr/src #显示/usr/src目录下的**文件(包含子目录)**包含magic的行
(6)grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
详细使用参见:http://www.cnblogs.com/end/archive/2012/02/21/2360965.html
·find path -option [ -print ] [ -exec -ok command ] /;
#-print 将查找到的文件输出到标准输出
#-exec command /; -----将查到的文件执行command操作, 和 /;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户
====================================================
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录
====================================================
$find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示
$find . -name "*.txt" -print
$find . -name "[A-Z]*" -pri26nbsp; #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录
=====================================================
$find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示
$find . -name "*.txt" -print
$find . -name "[A-Z]*" -print #查以大写字母开头的文件
$find /etc -name "host*" -print #查以host开头的文件
$find . -name "[a-z][a-z][0--9][0--9].txt" -print #查以两个小写字母和两个数字开头的txt文件
$find . -perm 755 -print
$find . -perm -007 -exec ls -l /; #查所有用户都可读写执行的文件同-perm 777
$find . -type d -print
$find . ! -type d -print
$find . -type l -print
$find . -size +1000000c -print #查长度大于1Mb的文件
$find . -size 100c -print # 查长度为100c的文件
$find . -size +10 -print #查长度超过期作废10块的文件(1块=512字节)
$cd /
$find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
$find /etc -name "passwd*" -exec grep "cnscn" /; #看是否存在cnscn用户
$find . -name "yao*" | xargs file
$find . -name "yao*" | xargs echo "" > /tmp/core.log
$find . -name "yao*" | xargs chmod o-w
======================================================
find -name april* 在当前目录下查找以april开始的文件
find -name april* fprint file 在当前目录下查找以april开始的文件,并把结果输出到file中
find -name ap* -o -name may* 查找以ap或may开头的文件
find /mnt -name tom.txt -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find /tmp -name wa* -type l 在/tmp下查找名为wa开头且类型为符号链接的文件
find /home -mtime -2 在/home下查最近两天内改动过的文件
find /home -atime -1 查1天之内被存取过的文件
find /home -mmin +60 在/home下查60分钟前改动过的文件
find /home -amin +30 查最近30分钟前被存取过的文件
find /home -newer tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录
find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录
find /home -used -2 列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find /home -user cnscn 列出/home目录内属于用户cnscn的文件或目录
find /home -uid +501 列出/home目录内用户的识别码大于501的文件或目录
find /home -group cnscn 列出/home内组为cnscn的文件或目录
find /home -gid 501 列出/home内组id为501的文件或目录
find /home -nouser 列出/home内不属于本地用户的文件或目录
find /home -nogroup 列出/home内不属于本地组的文件或目录
find /home -name tmp.txt -maxdepth 4 列出/home内的tmp.txt 查时深度最多为3层
find /home -name tmp.txt -mindepth 3 从第2层开始查
find /home -empty 查找大小为0的文件或空目录
find /home -size +512k 查大于512k的文件
find /home -size -512k 查小于512k的文件
find /home -links +2 查硬连接数大于2的文件或目录
find /home -perm 0700 查权限为700的文件或目录
find /tmp -name tmp.txt -exec cat /;
find /tmp -name tmp.txt -ok rm /;
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件
查当前目录下的所有普通文件
--------------------------------------------------------------------------------
# find . -type f -exec ls -l /;
-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README
查当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出
=================================================
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec -ok rm /;
=================================================
查询当天修改过的文件
[root@book class]# find ./ -mtime -1 -type f -exec ls -l /;
=================================================
查询文件并询问是否要显示
[root@book class]# find ./ -mtime -1 -type f -ok ls -l /;
< ls ... ./classDB.inc.php > ? y
-rw-r--r-- 1 cnscn cnscn 13709 1月 12 12:22 ./classDB.inc.php
[root@book class]# find ./ -mtime -1 -type f -ok ls -l /;
< ls ... ./classDB.inc.php > ? n
[root@book class]#
=================================================
查询并交给awk去处理
[root@book class]# who | awk '{print $1"/t"$2}
'
cnscn pts/0
=================================================
awk---grep---sed
[root@book class]# df -k | awk '{print $1}
' | grep -v 'none' | sed s"///dev////g"
文件系统
sda2
sda1
[root@book class]# df -k | awk '{print $1}
' | grep -v 'none'
文件系统
/dev/sda2
/dev/sda1
1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名
A) find /tmp -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
B) grep SYSCALL_VECTOR /tmp/*.h | cut -d':' -f1| uniq > filename
C) find /tmp -name "*.h" -exec grep "SYSCALL_VECTOR" /; -print
2)find / -name filename -exec rm -rf /;
find / -name filename -ok rm -rf /;
3)比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld ;
4)将find出来的东西拷到另一个地方
find *.c -exec cp '' /tmp ';'
如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir
6)查找2004-11-30 16:36:37时更改过的文件
# A=find ./ -name "*php"
| ls -l --full-time $A 2>/dev/null | grep "2004-11-30 16:36:37"
find 命令
简单示例:find . -type f -name "test"
-type f
普通文件-type d
目录-type p
管道-type l
符号链接-name "文件名"
要搜索的文件名- 还可以用
-iname
进行大小写无关的搜索
搜索文件的结果作为下一个命令的参数
使用-exec
参数,示例:
find . -type f -iname "*test*" -exec ls -l \{\} \;
*\{\}
是输入参数的占位符,哪里需要放哪里。这里的转义符在我的机器上可有可无 {}
也可以
\;
表示命令的结束 *
- 加上文件大小限制
-size
find . -type f -name "*.c" -size +100k
搜索当前目录下大于 100KB 的. C 文件
find . -type f -name "*.c" -size -1000c
搜索当前目录下小于 1000 字节的. C 文件
find . -type f -name "*.c" -size 1000c
搜索当前目录下等于 1000 字节的. C 文件
搜索 -1k 无效的,应换为 1024c
支持的单位:c
字节 w
字 k
千字节 M
兆字节 G
1G 字节 b
512 个字节块,相当于一个扇区, 单位是大小写敏感的
- 搜索最近修改的文件
ctime
最近访问,mtime
最近修改文件内容,atime
最近修改文件的节点信息
以ctime
为例, ctime n
表示最近 n 天以前访问的, ctime -n
表示最近 n 天之内访问的。
find . -type f -name "*.c" -ctime +1
修改一天以前访问的 .C 文件
*ctime 包括了 mtime, 同时还包括了文件权限、文件所属用户等基本信息的修改
他们的区别参见 Difference between mtime, ctime and atime*
还可以使用 cmin
mmin
amin
将时间粒度缩小到分钟
- 搜索指定用户的文件
find / -user syslog
搜索属于 syslog 用户的文件。
find / -group shadow
搜搜用户组 shadow 的文件
find / -perm 644
搜索 644 权限的文件
find / -perm -644
搜索包含 644 权限的文件,例如 744
find 命令是递归搜索目录的, 可以通过 -maxdepth num
指定递归的深度,该参数建议放在紧跟目录路径后的位置,不然会有一条警告。
grep 根据文件的内容进行搜索
基本示例:搜索某个文件中包含关键字: grep 'keyword' filename
多个文件空格分开
常用参数说明
选择正则匹配的模式:
-
-E
扩展正则模式,等价于egrep
-
-F
字符串,不使用正则匹配 ,等价于fgrep
-
-P
perl 的正则风格 (PCRE) -
-G
基本正则模式
-E
和-G
主要区别在于, 基本模式下?, +, {, |, (, )
这些元字符是失效的,作为普通字符解释。需要在基本模式中使用元字符请加转义符\
。例如我要匹配当前目录下文本中包含{{{
, 需要写成grep -R '{\{3\}' ./*
或者grep -ER '{{3}' ./*
。
建议将正则部分始终放在单引号中,例如想匹配 php 或 apache 应写成 egrep php \|apache
或egrep 'php|apache'
否则 |
在 linux 命令行下会被当作一个管道符号
grep,egrep,fgrep 的区别请戳我
影响匹配的其他参数
-
-i
忽略大小写 -
-w
单词匹配 -
-v
显示不匹配的行 -
-f
使用保存在文件中的正则表达式做匹配
egrep -f pattern.txt a.txt b.txt
使用 pattern.txt 的正则匹配,pattern.txt 内容为 [[:digit:]]{9}
,匹配结果为
a.txt:123456
b.txt:234575
保存正则表达式的文件, 默认一行一个正则,搜索中会将匹配所有正则的结果输出
-x
搜索的文件需要一整行匹配正则表达式
例如将上例中的 a.txt 第一行内容123456
修改为123456 789
, 执行如下命令
egrep -xf pattern.txt a.txt b.txt
, 匹配结果为
b.txt:234575
因为修改后 a.txt 的内容,不再一整行都满足正则,也可以理解为正则加了行首行尾的位置匹配: ^expression$
影响匹配结果显示的参数
-
-c
显示匹配的行数,不显示匹配的具体内容 -
-L
只显示没有匹配的文件名 -
-l
只显示匹配的文件名 -
-m num
限制匹配的次数,最大为 num 个
egrep -m 1 -f pattern.txt a.txt b.txt
这样一条指令,只会在每个文件中匹配 1 次,便开始搜索下一个文件 -
-o
only matching,只显示匹配一行中匹配到的内容。 grep 默认是将能包含匹配内容所在行输出,使用-o
则只打印匹配的部分 -
-n
显示匹配行在所匹配文件中行数。 -
-h
不显示匹配的结果中的文件名列
影响文件、目录搜索方式的参数
-r
or-R
递归的搜索目录, 很常用
区别在于 - R 会搜索符号链接指向的文件或目录; -r 则不会,除非该符号链接在参数中显示指定了一个符号链接,例如
egrep -rn '[[:digit:]]' ./ ./.local/share/systemd/user
,该命令在当前目录下搜索, 还包括了一个符号链接
--exclude=GLOB
跳过文件名匹配'GLOB'的文件,例如在版本库中搜索时
egrep --exclude=*.svn -rnf pattern.txt ./
排除版本库的文件
GLOB 中可以使用 , ?, []*
--include=GLOB
仅在文件名匹配'GLOB'的文件中搜索
示例
排除多个目录进行搜索
grep -rn --color --exclude-dir={node_modules,scripts,tests} "console.log" ./*
mac 下替换多个文件内容
grep -rl '10.0.2.118' ./*.js | xargs sed -i -e "s/abc/def/g"
mac 下替换 \t
为空格
find . -type f -name "*.js" -exec sed -i '' "s/$(printf '\t')/ /g" \{\} \;
linux 下查找大文件
find /var/logs/ -type f -size +1000000k -exec ls -lh {} \;