Skip to main content

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 \;

打包压缩

  • 命令文档:【Linux】tar压缩解压缩笔记 - 爱啦啦 - 博客园

  • 压缩单个文件:

    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"

  1. -type f 普通文件
  2. -type d 目录
  3. -type p 管道
  4. -type l 符号链接
  5. -name "文件名" 要搜索的文件名
  6. 还可以用 -iname 进行大小写无关的搜索

搜索文件的结果作为下一个命令的参数

使用-exec参数,示例:

find . -type f -iname "*test*" -exec ls -l \{\} \;
*\{\} 是输入参数的占位符,哪里需要放哪里。这里的转义符在我的机器上可有可无 {} 也可以
\; 表示命令的结束 *

  1. 加上文件大小限制 -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 字节 wk 千字节 M 兆字节 G 1G 字节 b 512 个字节块,相当于一个扇区, 单位是大小写敏感的

  1. 搜索最近修改的文件
    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 将时间粒度缩小到分钟

  1. 搜索指定用户的文件
    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 \|apacheegrep '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 {} \;

参考

  1. How to run grep with multiple AND patterns?